home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™94 / Talks & Papers / Timothy Knox / Help / Docs / Doc.Ascii < prev    next >
Text File  |  1994-06-24  |  85KB  |  1,962 lines

  1.  
  2.  
  3. Un Manuel Help
  4.  
  5. Un Manuel Help
  6.  
  7. Conclusion
  8.  
  9. Bibliographie
  10.  
  11. Bibliographie
  12.  
  13. Exemples
  14.  
  15. Index
  16.  
  17. Exemples
  18.  
  19. Index
  20.  
  21. Index
  22.  
  23. Index
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30. Help
  31.  
  32.  
  33. Version 1.0 (Janvier 91)
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42. Un dialecte Lisp paresseux inspiré de Scheme
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54. Logiciel  domaine public
  55. Copyright Thomas SCHIEX  1991
  56. e-mail: schiex@cert.fr, schiex@irit.fr
  57.  
  58.  
  59.  
  60.  
  61. Table des Matières
  62.  
  63.  
  64. Table des Matières    1
  65. 5.1 Survol de Help    3
  66. 5.1.1 Sémantique    3
  67. 5.1.2 Syntaxe    3
  68. 5.1.3 Notation et terminologie    4
  69. 5.2 Objets lisibles et non lisibles    5
  70. 5.2.1 Les nombres (fixnums, bignums et flottants)    5
  71. 5.2.2 Les listes    7
  72. 5.2.3 Les cellules    7
  73. 5.2.4 Les tableaux de chiffres binaires    7
  74. 5.2.5 Les chaînes    7
  75. 5.2.6 Les symboles    7
  76. 5.2.7 Objets non lisibles    9
  77. 5.2.8 Caractères spéciaux et délimiteurs    9
  78. 5.3 Les expressions primitives    10
  79. 5.3.1 Références à un littéral (constantes, symboles “quotés”…)    10
  80. 5.3.2 Références aux variables    11
  81. 5.3.3 Application de fermeture    11
  82. 5.3.4 Création de fermeture    11
  83. 5.3.5 Conditionnelle    12
  84. 5.3.6 Affectation    12
  85. 5.3.7 Suspension non mémoïzante    12
  86. 5.3.9 Capture de l’environnement    13
  87. 5.3.10 Définition de macros    13
  88. 5.3.10 Définition de fonctions externes    13
  89. 5.3.11 Construction de liaisons    13
  90. 5.3.12 Evaluation en séquence    14
  91. 5.3.12 Déverminage    14
  92. 5.4 Les fermetures    16
  93. 5.4.1 Booléens    16
  94. 5.4.2 Prédicats d’équivalence    16
  95. 5.4.3 Listes et doublets    17
  96. 5.4.4 Symboles    19
  97. 5.4.5 Nombres    20
  98. 5.4.6 Fermetures    22
  99. 5.4.7 Macros    23
  100. 5.4.8 Cellules    23
  101. 5.4.9 Environnements    24
  102. 5.4.10 Tableau de bits    25
  103. 5.4.11 Entrées-Sorties    27
  104. 5.4.12 Erreurs et gestion d’erreurs    28
  105. 5.4.13 Contrôle    29
  106. 5.4.14 Système    30
  107. 5.5 L’interface Help    33
  108. 5.5.1 Configuration    33
  109. 5.5.2 Utilisation de l’éditeur    34
  110. 5.5.2 L’évaluateur et les “bugs”…    35
  111. Bibliographie    39
  112. Exemples    43
  113. Index    47
  114.  
  115.  
  116. Les consignes habituelles pour la diffusion d’un logiciel domaine public sont applicables à Help: ne diffusez pas l’archive si vous la modifiez (surtout si des fichiers disparaissent). Passez plutot par moi  pour les ajouts ou modifications…
  117.  
  118. Thomas SCHIEX
  119. Centre d’Etudes et de Recherche de Toulouse (ONERA)
  120. 2, Av Edouard Belin
  121. BP 4025
  122. 31055 TOULOUSE CEDEX
  123. e-mail: schiex@cert.fr
  124.  
  125. A titre indicatif, Help est essentiellement écrit en assembleur. Son portage en C ou autre langage portable n’est pas envisagé à court terme. Je dégage bien sur toute responsabilité pour les dommages que pourraient causer l’utilisation de Help. Vous pouvez évidemment me faire parvenir toute remarque, mais je ne garantit pas de la prendre en compte.
  126.  
  127. Enfin, les différents fichiers et dossiers de l’archive sont organisés comme suit:
  128.  
  129. Paresseux: l’interprete HELP lui-même ;
  130. Help Files: comme son nom l’indique. On trouvera differents problemes classiques du lambda-calcul, un solveur de contraintes s’appuyant sur un “test and generate” bestial, un compilateur pour Help…
  131. Docs: comme son nom l'indique.
  132. Resources: Des ressources à coller dans Paresseux pour changer les menus en français ou anglais, des ressources pour changer la semantique, des resources à coller dans votre Resedit pour faciliter l'édition des ressources Help (cf .5.5).
  133.  
  134. Bonne chance !
  135. 5 Le manuel
  136.  
  137. Rappelons que Help est, avant tout, un dialecte Lisp. Toute personne connaissant déjà bien Lisp et plus particulièrement Scheme peut se permettre (dans un premier temps) de survoler rapidement la présentation de Help et de ses objets. Une utilisation de l’évaluateur sur MacII nécessite la lecture du §5.5FR.
  138.  
  139. 5.1 Survol de Help
  140.  
  141. 5.1.1 .i.Sémantique
  142.  
  143.  
  144. t  Help est un langage statique1 (portée des variables lexicales) tout comme Scheme, Algol… Chaque utilisation d’un identificateur est associée avec une liaison lexicalement visible de cet identificateur.
  145.  
  146. t  Help est un langage non strict, employant l’évaluation paresseuse (call by need) pour tous ses passage d’arguments comme le font Lazy Miranda, Hope…
  147.  
  148. t  Help est un langage faiblement typé. Les types sont associés aux valeurs plutôt qu’aux identificateurs de variables. C’est le cas de tous les dialectes Lisp mais aussi d’APL, Snobol…
  149.  
  150. t  Les fermetures (ou procédures) Help sont des objets Help à part entière qui peuvent être créés dynamiquement, accumulés dans des structures de données de taille éventuellement infinie… Help partage cette qualité avec Scheme et la grande majorité des langages fonctionnels (Hope, Miranda, Daisy…)
  151.  
  152. t  Les objets Help (fermetures , environnements inclus) ont une durée de vie illimitée. Le système de gestion de la mémoire ne se permettra de récupérer la place occuper par un objet que s’il peut démontrer qu’il ne peut plus être référencé (Garbage Collector). Tous les dialectes Lisp, APL et de nombreux langages fonctionnels reposent sur un système de gestion de la mémoire de ce type.
  153.  
  154. t  Help ne possédant aucune structure de contrôle itérative (s'accommodant mal avec la paresse), les évaluateurs Help éliminent les récursions terminales simples.  Ceci permet d’utiliser la récursivité en utilisant une place mémoire fixe si cela est possible.
  155.  
  156.  
  157. 5.1.2 Syntaxe
  158.  
  159. t    Help emploie la notation polonaise avec parenthèses et crochets pour décrire la majorité des programmes et données. Cette syntaxe dont la pauvreté est une des grande richesse est employée (à quelques variantes prés)  par tous les dialectes Lisp récents2.
  160.  
  161. 5.1.3 Notation et terminologie
  162.  
  163. La définition de Help est loin d’être figée et de nombreux retours de valeurs, domaine de définition … ne sont pas encore complètement spécifiés.  Dans ces cas, on parlera de valeur…non spécifiée, ce qui est différent d’une valeur indéterminée qui s’exprime en Help par le biais du symbole d’erreur “?”.
  164.  
  165. Dans la suite, les exemples codés en Help seront systématiquement imprimés dans la fonte exemples. Le symbole “fl” utilisé dans ces exemples doit se lire “dont la valeur s’imprime”. Du fait de la paresse, il y a une différence importante entre forme interne (contenant des formes suspendues) et forme externe (forme affichée), cette distinction est donc primordiale. Les valeurs de taille infinie sont, en général, limitée par l’imprimeur. Des points de suspension (…) indiqueront que la structure n’a pas été épuisée.Par exemple:
  166.  
  167. (letrec [(x (cons 1 x))] x) fl (1 1 1 1 1 1 1 …)
  168.  
  169. Les § 5.3 et 5.4FR sont organisés par “fiches”. Chaque fiche présente une fermeture ou une forme syntaxique du langage et commence par un en-tête comportant un modèle d’utilisation de la forme précisant son type (forme syntaxique, fermeture (séparées en ProcN d’arité fixe et NProc d’arité variable) ainsi que son arité (arité minimale pour les NProcs). Le domaine de définition de la forme est indiqué dans le modèle d’appel par le nom des arguments en fonte arguments. Si il n’y a pas de restriction sur le type des arguments, le mot quelconque  sera utilisé. Les types référencés sont:
  170.  
  171. nombre      entier taille fixe, “bignum” ou flottant
  172. entier      entier taille fixe, “bignum” 
  173. fix      entier taille fixe
  174. posfix      entier taille fixe positif ou nul
  175. bignum      “bignum” 
  176. flottant      flottant
  177. smallnul      entier de taille fixe ou flottant
  178. liste      doublet ou ()
  179. doublet      doublet
  180. cellule      cellule
  181. environ     environnement
  182. applicable     une fermeture ou un fixpos
  183. symbole      symbole, erreur, constante,mot-clé…
  184. ident     identificateur de variable ou contante
  185. identv     identificateur de variable
  186. mot-clé      mot clé syntaxique
  187. erreur      erreur
  188. bit-array      tableau de bits
  189. io-unit     unité d’entrées/sorties
  190. quelconque      tous type d’argument
  191.  
  192. Exemple:
  193.  
  194. (cell=? cellule posfix)    Fermeture:ProcN    2
  195.  
  196. indique que cell=? est une fermeture d’arité fixe et égale à 2, prenant en argument une cellule et un nombre entier positif de taille fixe.
  197.  
  198. 5.2 Objets lisibles et non lisibles
  199.  
  200. Un grand nombre de types d’objets différents cohabitent dans la mémoire de Help à un moment donné. La majorité des objets dont la représentation externe a une importance pour l’utilisateur sont aussi “lisibles” (i.e. il est possible de décrire un de ces objets de façon à ce que le lecteur Help créé en mémoire une représentation interne de cet objet). Pour des raisons pragmatiques ou de faisabilité, certains objets possèdent une représentation interne, éventuellement une représentation externe mais ne sont  pas lisibles.
  201.  
  202. Le lecteur Help ne fait aucune distinction entre majuscules et minuscules (si ce n’est à l’intérieur des chaînes de caractères et des symboles internés via le caractère “backslash”). Ainsi les symboles Foo, fOO représentent un seul symbole. Les caractères d’espace (ASCII 32) et de retour chariot (ASCII 13) sont des délimiteurs.
  203.  
  204. Dans la suite, nous distinguerons séquence de caractères (suite de caractères dans le flot d’entrée délimitée par des caractères … délimiteurs (Cf § 5.2.7FR)) et chaîne de caractères qui est un type d’objet Help.
  205.  
  206. 5.2.1 Les nombres (fixnums, bignums et flottants)
  207.  
  208. Pour l’instant, rationnels et complexes ne sont implémentés en Help. De plus, il existe encore de grosses restrictions sur les nombres entiers en précision illimitée. Ceci est principalement dû à l’age du langage Help.
  209.  
  210. 5.2.1.1 Les .i.entiers
  211.  
  212. Un nombre entier est toujours lu dans la base d’entrée courante du lecteur. Cette base est fixée via la fermeture ibase décrite par ailleurs. La définition des caractères formant ou non un nombre entier dépend de cette base. Si la base est inférieure ou égale à 10 (en décimal), alors les caractères compris entre “0” et la base moins un forment le jeu de caractère dédiés aux nombres entiers. Si cette base dépasse 10 (elle est limitée à 36 de façon interne), le jeu de caractère est étendu avec “a”…”z”. Ainsi, en base hexadécimal, la chaîne de caractères “ff” décrit elle un nombre entier (et non un symbole) de valeur 255 (décimal).
  213.  
  214. Soit CarNum, l’ensemble des caractères couramment dédiés à la lecture des nombres.
  215.  
  216. nombre::=      nombre_non_signé    | 
  217.     +nombre_non_signé    | 
  218.     -nombre_non_signé
  219. nombre_non_signé::=     CarNum*
  220.  
  221. Exemples:     123 +123 -123 +235987459862345  (en base 10 au moins)
  222.         12af  (base 16)  -foobar (base 29)
  223.  
  224. Dans l’avenir, la lecture se fera par défaut en décimal, et c’est le flot de lecture lui-même qui pourra éventuellement décider de changer localement de base via l’utilisation de caractères spéciaux.
  225.  
  226. 5.2.1.1.1 Entiers de taille fixe
  227.  
  228. Quand il existe une représentation d’un nombre en entier de taille fixe, le lecteur générera automatiquement cette représentation interne. La valeur d’un entier de taille fixe est comprise entre -2 147 483 648 et 2 147 483 647.
  229.  
  230. 5.2.1.1.2 Entiers en précision illimitée
  231.  
  232. Tout nombre entier dépassant la capacité d’un entier fixe sera automatiquement lu sous forme de “bignum”. Il faut tout de même être sensible au fait que l’utilisation des “bignums” repose sur un usage intensif des piles et dimensionner la taille de celles-ci en conséquence. De même, l’impression d’un gros “bignum” (…) peut nécessiter un travail important. 
  233.  
  234. L’allocation de “bignums” temporaires sur la pile lors de calculs sur ceux-ci implique que la taille d’un “bignum” est limitée:     1- par la place restante dans le Tas;
  235.                 2- par la place restante dans la pile !
  236.  
  237. Il est donc possible de générer une erreur du type “Piles pleines” avec une écriture récursive terminale de Fibonacci pour des valeurs importantes (essayez (fib 50000)) du fait seul de la place occupée sur la pile par les “bignums” manipulés 5NB/ il existe à l’heure actuelle un bug dans la multiplication de bignums)..
  238.  
  239. 5.2.1.2 Les .i.flottants
  240.  
  241. Toute séquence de caractères (qui n’est pas à l’intérieur d’une chaîne de caractères ou d’un symbole interné via le “backslash”) contenant le caractère “.” sera considéré par le lecteur comme l’expression d’un nombre flottant. 
  242.  
  243. Le standard Motorola IEEE “extended-precision floating point” est actuellement utilisé. Il permet de coder des flottants d’approximativement 1.9*10-4951 à 1.1*104932 . Ils possèdent entre 19 et 20 chiffres de précision. Il permet aussi de représenter le résultat d’opérations illicites (division par zéro…) en générant des “NaNs3” ou des “infinités”. Ces derniers ne sont pas lisibles, mais sont imprimables et manipulables comme comme n’importe quel flottant.
  244.  
  245. La lecture peut se faire en notation scientifique (emploi du caractère “e” ou “f” pour séparer mantisse et exposant) ou en notation classique (mantisse seule). Le nombre flottant est toujours lu en décimal. La mantisse, comme l’exposant peuvent être précédées d’un signe “+” ou “-”. 
  246.  
  247. Exemples:     1.123456789123456789
  248.         1.1234f-2001
  249.         -233.2e+63
  250.  
  251. 5.2.2 Les .i.listes ;(doublets)
  252.  
  253. La notation des listes est parenthèsée et repose sur la notion de doublets4 (comme en Lisp):
  254.  
  255. t    Les caractères “(“, “)” et “|” sont réservés à la représentation des listes et sont des délimiteurs;
  256. t    Une liste vide sera représentée par un symbole spécial noté “()”;
  257. t    Un doublet  x(car | cdr) est représenté par:   ( <car> | <cdr> ) ou <car> est la représentation de “car”…;
  258. t    Une notation simplifiée permet d’éviter d’écrire (dans le cas où un cdr est un doublet ou la liste vide) les couples “| (“ et  “)” correspondante. Ainsi, on écrira indifféremment: (1 | ()) ou (1).
  259.  
  260. Exemples:      (1 | 2)
  261.         (1 2 3 4)
  262.         (1 | (2 | ()))
  263.         (1 (2 3 4) (5 (6)) 1)
  264.  
  265. 5.2.3 Les .i.cellules; (vecteurs)
  266.  
  267. Une cellule (ou vecteur) sera représentée au moyen des caractères spéciaux délimiteurs “[“ et “]”.  Ainsi, une cellule de trois éléments e1, e2, e3 sera représentée par [<e1> <e2> <e3>]
  268.  
  269. Exemples:    []
  270.         [1 2 3]
  271.         [[1 2][2 3]]
  272.  
  273. 5.2.4 Les tableaux de chiffres binaires
  274.  
  275. Le caractère délimiteur “%” permet de représenter les tableaux de chiffres binaires (.i.bit-arrays;). La séquence de caractère qui le suit  doit être formée uniquement de caractères “0” ou “1”.
  276.  
  277. Exemples:    %
  278.         %11011000110110001101100011011000
  279.  
  280. 5.2.5 Les .i.chaînes ;de caractères
  281.  
  282. Le caractère “““ sert de délimiteur aux chaînes de caractères. Tous les caractères suivant un “““ jusqu’au prochain “““ sont considérés comme faisant partie de la chaîne de caractères formée (y compris les caractères de contrôle comme retour chariot, linefeed…)
  283.  
  284. 5.2.6 Les .i.symboles; atomiques (symboles, constantes, erreurs…)
  285.  
  286. Toute séquence de caractères n’entrant pas dans les domaines syntaxiques définis précédemment et ne contenant pas de caractère délimiteur “:”sera interprété comme un symbole atomique simple.
  287.  
  288. Il est possible de “forcer” le lecteur à reconnaître un symbole dans une unité syntaxique quelconque en utilisant le caractère spécial “\”. Ainsi, la lecture du flot de caractères “\12\” retournera un symbole dont le nom sera “12”.
  289.  
  290. De plus, les symboles atomiques forment une arborescence (identique à l’arborescence des packages en Le_Lisp) à la disposition de l’utilisateur. Un symbole atomique simple a pour parent “()”. Il est possible de désigner un des fils d’un symbole en faisant suivre ce symbole du caractère délimiteur “:” et du symbole fils. Ainsi:
  291.  
  292.     a      symbole “a” de père “()”
  293.     a:b      symbole “b” de père “a”, lui même de père “()”
  294.     a:b:c:d:e    symbole “e” de père “d”… 
  295.  
  296. Les symboles atomiques ont de nombreuses utilisations en Help. Ils permettent de représenter:
  297.  
  298. t    symboles     ‘a
  299. t    identificateurs de variable     a
  300. t    mots clés     (lambda (x) (1+ x))
  301. t    macro-expressions     (defmacro useless (lambda (t) ‘()))
  302. t    erreurs     ?:var-undef
  303. t    constantes     (1+ 1)
  304.  
  305. Il n’y a pas véritablement de syntaxe particulière pour chacune de ces représentation. Des moyens sont (en général) fournis à l’utilisateur pour associer à un symbole donné un type donné. 
  306.  
  307. Au démarrage, un certain nombre de symboles sont déjà ainsi définis.
  308.  
  309. 5.2.6.1 Mots clés:
  310.  
  311. Les symboles suivants sont réservés comme .i.mots clés; du langage:
  312.  
  313. lambda cond define =! begin step nomemo
  314. defmacro quote let letrec bindings warn
  315.  
  316. 5.2.6.2 Erreurs:
  317.  
  318. Le tableau suivant permet de considérer l’ensemble des .i.erreurs; prédéfinies du système Help. En général (ce n’est pas obligatoire) une erreur est un symbole fils du symbole” ?”.
  319.     
  320. Symbole     Cause de l’erreur
  321. ?    Erreur indéfinie
  322. ?:too-args    Trop d'arguments
  323. ?:few-args    Trop peu d'arguments
  324. ?:bad-type    Mauvais type d'arguments
  325. ?:bad-expr    Expression mal formée
  326. ?:syn-keyw    Mot clé en mauvaise position
  327. ?:syntx-er    Erreur de syntaxe
  328. ?:mem-full    Plus de mémoire
  329. ?:no-apply    Objet non applicable
  330. ?:indx-out    Index hors limite
  331. ?:strange!    Erreur indescriptible
  332. ?:overflow    Dépassement de capacité
  333. ?:cb-break    Break utilisateur
  334. ?:lispstck    Pile Lisp inconsistante
  335. ?:contstck    Pile de contrôle inconsistante
  336. ?:varundef    Variable non définie
  337. ?:stckfull    Piles pleines (collision)
  338. ?:maxlengt    Longueur max atteinte
  339. ?:io-error    I/O error
  340. ?:eof-error    Fin de fichier
  341. ?:dead-cont    Continuation chronologique morte
  342.  
  343. 5.2.6.3 Constantes:
  344.  
  345. De très nombreuses .i.constantes; sont prédéfinies. La grande majorité de celles-ci dénotent des fermetures et seront décrites  dans §5.4.FR 
  346.  
  347. Le symbole “()” est  une constante égale à lui-même dénotant la liste vide;
  348. Le symbole “†” est une constante égale à lui-même dénotant le booléen VRAI;
  349. Le symbole “ƒ” est une constante égale à lui-même dénotant le booléen FAUX;
  350.  
  351. A la différence de la grande majorité des dialectes Lisp, le symbole “()” est interprété comme VRAI en HELP. Seul le booléen “ƒ” dénote FAUX.
  352.  
  353. 5.2.7 Objets non lisibles
  354.  
  355. Parmi tous les objets apparaissant  dans le mémoire, un certain nombre ne sont pas descriptibles directement par l’utilisateur. Il s’agit des:
  356.  
  357. t    Environnements (imprimables);
  358. t    Fermetures (imprimables);
  359. t    Code (imprimable partiellement);
  360. t    Unités d’I/O (non imprimables);
  361. t    Formes suspendues (non imprimables);
  362.  
  363.  
  364. 5.2.8 Caractères spéciaux et délimiteurs
  365.  
  366. Le tableau suivant présente la liste des .i.caractères spéciaux;, s’ils sont délimiteurs, ainsi que (si ils existent) les délimiteurs correspondants et leur rôle. Lorsqu’un nombre est indiqué, il indique le code Ascii du caractère en question. Ces caractères sont modifiables par l’utilisateur (Cf §4.2.6FR).
  367.  
  368. C    Délim    Corresp    Rôle
  369. (    oui    ) |    délimite le début d’une liste, d’un doublet
  370. )    oui    ( |    délimite la fin d’une liste, d’un doublet
  371. |    oui    ( )    sépare CAR et CDR d’un doublet
  372. [    oui    ]    délimite le début d’une cellule
  373. ]    oui    [    délimite la fin d’une cellule
  374. %    oui    delim.    marque le début d’un tableau de chiffres binaires
  375. “    oui    “    fin et début d’une chaîne de caractère
  376. ;    oui    13    début de remarque sur une fin de ligne
  377. {    oui    }    début de remarque
  378. }    oui    {    fin de remarque
  379. 32    oui        espace: séparateur
  380. 13    oui        Retour chariot: séparateur
  381. \    oui    \    force l’interneur
  382.  
  383.  
  384. 5.3 Les .i.expressions primitives; Help et leurs dérivées
  385.  
  386. Tout programme Help est formé d’une séquence de définitions réalisée via la forme define.
  387.  
  388. (.i.define; <ident> <quelconque>)    Forme syntaxique    x
  389.  
  390. Permet de définir <ident> en tant que valeur de <quelconque>.
  391.  
  392. (.i.define; <closdef>  <corps>)    Forme syntaxique    x
  393.  
  394. Permet de définir une fermeture. <corps> est une séquence d’expressions quelconques et constitue le corps de la fermeture. <closdef> est une liste dont le CAR doit être un identificateur (nom de la fermeture ainsi définie) et le CDR une “liste” de paramètres formels (Cf. lambda)
  395.  
  396.  
  397. 5.3.1 Références à un littéral (constantes, symboles “quotés”…)
  398.  
  399.  
  400. (.i.quote; <quelconque>)    Forme syntaxique    x
  401. (’ <quelconque>)    Forme syntaxique    x
  402.  
  403. Retourne l’objet dont la représentation externe est <quelconque>. Cette forme est utilisée pour référencer des littéraux dans du code Help. (quote <x>) peut être abrégé en ‘<x>.
  404.  
  405. (quote (+ 1 2))    fl (+ 1 2)
  406.  
  407. <constant>    Forme syntaxique    x
  408.  
  409. Retourne l’objet dont la représentation externe est constant dans le cas où cette représentation dénote un objet “constant” (invariant par évaluation). Cette forme est utilisée pour référencer des littéraux dans du code Help.
  410.  
  411. †    fl †
  412. 1    fl 1
  413.  
  414. 5.3.2 Références aux variables
  415.  
  416. <ident>    Forme syntaxique    x
  417.  
  418. La valeur retournée est celle stockée à l’emplacement auquel l’identificateur est lié dans l’environnement courant.  La référence à une variable non liée dans l’environnement courant retournera l’erreur ?:varundef.
  419.  
  420.  
  421. 5.3.3 Application de fermeture
  422.  
  423. (<operateur> <operande1>…)    Forme syntaxique    x
  424.  
  425. L’appel à une fermeture est écrit simplement et systématiquement en mettant entre parenthèses les expressions dénotant la fermeture à appeler et les arguments qui doivent lui être passés. L’<opérateur>  est évalué, mais les <operande1>… ne seront évalués que si la fermeture “accede” à ces arguments.
  426.  
  427. (+ 1 2)                fl  3
  428. ((0 (list - +)) 32 10)    fl  22
  429.  
  430. De nombreuses procédures sont prédéfinies dans l’environnement initial. De nouvelles procédures peuvent être définies en utilisant la forme syntaxique (lambda…).
  431.  
  432.  
  433. 5.3.4 Création de fermeture
  434.  
  435. (.i.lambda; <formels> <corps>)    Forme syntaxique    x
  436.  
  437. Retourne une fermeture contenant (entre autres) l’environnement existant lors de l’évaluation de la forme (environnement capturé). L’application ultérieure de la fermeture ainsi créée à d’éventuels arguments entraînera l’évaluation du <corps> de la forme dans l’environnement capturé étendu avec les liaisons des paramètres <formels> à de nouveaux emplacements contenant les arguments. La valeur retournée sera la valeur retournée par la dernière évaluation. Si le <corps> est vide, l’erreur ? sera retournée.
  438.  
  439. <formels> doit avoir une des formes suivantes:
  440.  
  441. •    (<ident1> … <identn>): La fermeture retournée sera alors une procédure à n arguments. Lors de l’application, chaque paramètre formel sera “lié” à chaque argument.
  442. •    <ident>: La fermeture retournée sera alors une procédure d’arité quelconque. Lors de l’application, le paramètre formel sera “lié” à la liste (fraîchement allouée) des arguments.
  443. •    (<ident1> … | <identn>): La fermeture retournée sera alors une procédure à (n - 1) arguments au moins. Lors de l’application, le dernier paramètre sera “lié” à la liste des arguments en excès.
  444.  
  445.  <corps> est une séquence éventuellement vide d’expressions.
  446.  
  447. (lambda(x) x)                fl  {Closure (x) x) in ()}
  448. ((lambda x x) 1 2 3)            fl  (1 2 3)
  449.  
  450. 5.3.5 Conditionnelle
  451.  
  452. Notez que la forme syntaxique COND n’est conservée que pour des raisons d’efficacité (vu sa grande fréquence d’utilisation). Une version entièrement compilée de Help ne comprendra plus cette forme.
  453.  
  454. (.i.cond; <clause1>…)    Forme syntaxique    x
  455.  
  456. Chaque <clause> est une séquence de deux expressions quelconques, la dernière <clause> pouvant éventuellement se limiter à une séquence de une expression.
  457.  
  458.  
  459. La première expression de la première <clause> est évaluée. Si elle délivre une valeur fausse (égale à ƒ), alors on passe à la <clause> suivante si il y en a, sinon on retourne ƒ. Si elle délivre une erreur, alors on retourne cette erreur, sinon on retourne la valeur de la seconde expression de la <clause> si il y an une, sinon on retourne la valeur de la première expression.
  460.  
  461. (cond (=? 2 (1+ 1)) “oui” “ca va pas”)    fl  oui
  462. (cond (>? -3 0) -3
  463.       (<? -3 -5) (- 0 -3)
  464.       (+ 2 2))                    fl  4
  465.  
  466. 5.3.6 Affectation
  467.  
  468. (.i.=!; <ident> <quelconque>)    Forme syntaxique    x
  469.  
  470. L’emplacement auquel <ident> est lié reçoit la valeur de la forme <quelconque> dans l’environnement courant. Cette forme syntaxique est une des caractéristiques “non fonctionnelle” de Help. 
  471.  
  472. (=! x 2)        fl  2
  473. (=! z (cons 1 z))    fl  (1 1 1 1 1 1 1 …)
  474.  
  475.  
  476. 5.3.7 Suspension non mémoïzante
  477.  
  478. (.i.nomemo; <booléen> <quelconque>…)    Forme syntaxique    x
  479.  
  480. Le <booléen> est d’abord évalué. Sa veleur indique si la suppression de la mémoïzation doit être activée (vrai) ou désactivée (faux). Les formes <quelconque> vont ensuite être évaluées en séquence. Si le <booléen> n’a pas pour valeur ƒ (faux), toute suspension qui pourrait être créée par ces évaluations sera une suspension définitive… (sans mémoïzation, et si la mémoïzation n’est pas forcée localement par l’utilisation d’un (nomemo ƒ …)) Il faut noter la fragilité du caractère “définitif” de ces suspensions. En effet, si une suspension s1 créée par nomemo est suspendue classiquement (formant s2) , tout accès à la suspension s2 entraînera l’évaluation de s1 et la mémoïzation de la valeur dans s2 empêchant toute nouvelle évaluation de la forme de s1 via s2. Si le <booléen>a pour valeur ƒ, la mémoïzation est localement réactivée.
  481.  
  482. (define z
  483.    (nomemo † (cons (print “CAR”)
  484.                       (print “CDR”))))        
  485. z                            fl  (? | ?)
  486.                                 et imprime “CAR” et “CDR”
  487. z                            fl (? | ?)
  488.                                  et imprime “CAR” et “CDR”
  489. (define zz (list z z))
  490. zz                            fl  ((? | ?) (? | ?))
  491.                                 et imprime “CAR”, “CDR” (2 fois)
  492. zz                            fl  ((? | ?) (? | ?))
  493.                                 mais n’imprime rien…
  494.  
  495. 5.3.9 Capture de l’environnement
  496.  
  497. (.i.bindings;)    Forme syntaxique    x
  498.  
  499. Retourne l’environnement courant. Si celui ci est l’environnement global, le symbole () est retourné. Ne peut être une fermeture puisque le corps des fermetures sont évalués dans l’environnement capturé et non dans l’environnement courant auquel elles n’ont plus accès.
  500.  
  501. (bindings)                    fl ()
  502. ((lambda(x) (bindings)) 1)            fl {Env: «x=1» Then ()}
  503.  
  504.  
  505. 5.3.10 Définition de macros
  506.  
  507. (.i.defmacro; <quelconque>)    Forme syntaxique    x
  508.  
  509. Permet de définir une macro. La syntaxe est la même que celle de define. Sous l’interprète, l’appel à une macro est remplacé physiquement par la valeur retournée lors de la première exécution (macros déplaçantes). Si on utilise le compilateur, les macros sont expansées lors de la compilation. Il est donc indispensable de définir les macros avant que le code qui les utilisent ne soit compilé.
  510.  
  511. (defmacro (mapause m)
  512.    `(begin (prin “Pause à “)
  513.            (print ‘,m)
  514.            (pause)))
  515. (define (test n)(mapause test)(1+ n))
  516. Après une exécution:
  517. test            fl {Closure:((n) (begin (prin “Pause à “)
  518.                                          (print ‘test)
  519.                                            (pause)) (1+ n)))…}
  520.  
  521. 5.3.10 Définition de fonctions externes
  522.  
  523. (.i.defext; <fic><seg><nom><str> | <par>)    Forme syntaxique    x
  524.  
  525. Permet de définir une fonction externe. L’écriture du code externe (sous MPW) doit suivre les conventions exposées au §4.5.1.3.1.2, doit être lié à la librairie LibHelp.o …(Cf dossier exemples).
  526. Les paramètres sont:
  527.  
  528. t    <fic>    nom du fichier (ressources CODE);
  529. t    <seg>    nom du segment contenant le code de la fermeture;
  530. t    <nom>    nom à donner à la fermeture
  531. t    <str>    vecteur de bits de “strictness” (Cf setstrict)
  532. t    <par>    les paramètres
  533.         
  534. 5.3.11 Construction de liaisons
  535.  
  536. (.i.let; <liaisons> <corps>)    Forme syntaxique    x
  537.  
  538. Il y a évaluation de <corps> dans l’environnement courant étendu avec les <liaisons>.
  539. La portée des liaisons créées est limitée au <corps>.
  540.  
  541. <liaisons> est une cellule formée de listes qui peuvent avoir les formes:
  542.  
  543. • (<ident> <quelconque>): <ident> sera lié (paresseusement) à la valeur de <quelconque>.
  544. • (<closdef> <corpsclos>): permet la définition d’une fonction locale (non récursive du fait de la portée limitée des liaisons) plus aisément qu’en utilisant une lambda expression. <corpsclos> est une séquence d’expressions quelconques, <closdef> est une liste dont le CAR doit être un identificateur (nom de la fermeture ainsi définie) et le CDR une “liste” de paramètres formels (Cf. lambda).
  545.  
  546. (let [(x 1.1)
  547.       ((double n)(+ n n))]
  548.      (double x))                fl 2.200000000000000e+00
  549.  
  550.  
  551. (.i.letrec; <liaisons> <corps>)    Forme syntaxique    x
  552.  
  553. La syntaxe est la même que pour let mais la portée des liaisons créées est égale à l’union de <liaisons> et <corps>. Il est possible (comme pour let) de définir ainsi des fonctions locales qui ici peuvent être récursives. Du fait de la paresse, il n’y a pas (comme en Scheme par exemple) de problème de définition d’objets faisant immédiatement référence aux identificateurs définis. 
  554.  
  555. (let [(r (fib 20))            ;erreur en Scheme
  556.       ((fib n)                ;(fib fonction non définie)
  557.         (cond (<? n 2) 1
  558.               (+ (fib (1- n))(fib (- n 2)))))]
  559.      r)                    fl 10946
  560.  
  561. 5.3.12 Evaluation en séquence
  562.  
  563. (.i.begin; <quelconque1>…)    Forme syntaxique    x
  564.  
  565. Evaluation en séquence des <quelconque1>…. Permet de regrouper les évaluations pour qu’elles se réalisent au même instant. Ceci est particulièrement utile pour les interactions avec l’utilisateur.
  566.  
  567. (let [(x (begin (prin “Entrez x”)(read)))]
  568.      (traiter x))                fl …selon traiter
  569.  
  570. 5.3.12 .i.Déverminage
  571.  
  572. Le système de .i.gestion d’erreurs; Help, du fait de la paresse (qui permet de construire des objets de façon partielle), n’interrompt pas l’évaluation lorsqu’intervient une erreur. Suivant le mode courant d’évaluation, il peut y avoir:
  573.  
  574. t    passage d’un objet du type erreur à la continuation (mode ƒ);
  575. t    passage d’un objet du type erreur à la continuation et affichage d’un message sur stder (mode ());
  576. t    appel à un “debugger”  (mode †).
  577.  
  578. (.i.pause;)    Forme syntaxique    x
  579.  
  580. Permet de se retrouver dans une boucle READ-EVAL-PRINT locale avec un prompt de la forme {n}† où n représente un niveau d’imbrication des pauses. La sortie de la boucle se fait si il y a lecture du symbole † (du fait de la nature du “prompt”, il suffit donc de taper ENTER). Toute action est possible durant la boucle (évaluations diverses…). La valeur retournée est le symbole ?.
  581.  
  582. (.i.warn; <ident> <quelconque1>…)    Forme syntaxique    x
  583.  
  584. Evalue les formes <quelconque1>… dans le mode spécifié par <ident> (Cf § précédent). Il faut noter que les évaluation retardées qui peuvent apparaître du fait de la paresse se feront effectivement dans le mode indiqué, même si alors on est sorti du warn ( les suspensions capturent donc le mode courant de gestion d’erreurs).
  585.  
  586. Le “debugger” consiste (pour le moment) est une simple boucle READ-EVAL-PRINT (Cf pause) dont on peut sortir (pour reprendre l’exécution) en faisant lire le symbole † (vrai). L’expression et la valeur ayant probablement causé l’erreur sont affichées. Les différentes fermetures et formes syntaxiques bindings, envar, stack… permettent alors de consulter l’environnement, la pile, les valeurs de variables…La fermeture break permet de retourner au TopLevel. Il faut noter que la demande de valeurs (sous le debugger) peut déclencher des évaluations qui n’aurait pas du se produire et modifier ainsi le séquencement du programme.
  587.  
  588. (warn ƒ (+ 0 ‘a))            fl     ?:bad-type
  589.                             et aucun message d’erreur
  590.  
  591. (.i.step; <booléen> <quelconque1>…)    Forme syntaxique    x
  592.  
  593. Le <booléen> est d’abord évalué. Sa valeur de vérité va indiquer si l’on doit localement armer ou désarmer le mode pas à pas. Les formes <quelconque1>… .seront donc évaluées dans le mode indiqué.  Il faut noter que les évaluation retardées qui peuvent apparaître du fait de la paresse seront effectivement exécutées en pas à pas, même si alors on est sorti du step ( les suspensions capturent donc le mode courant d’évaluation). A chaque pas, la fonction step? (définie par l’utilisateur) est appelée avec la forme qui va être évaluée et l’environnement. Si la valeur retournée est faux (ƒ), il n’y pas de pas à pas pour l’évaluation de cette forme. Sinon, la fermeture stepin est appelée avec la forme et l’environnement. La valeur qu’elle retourne est passée avec la valeur de l’expression “steppée” à la fermeture stepout.
  594.  
  595. Exemple:
  596.  
  597. (step † (+ 1 2))            fl     3 et par exemple la session suivante:
  598. -> "(+ 1 2)"{1}† 
  599. -> "+"{1}† 
  600. <- "{Closure:{Code 680xx for +} Env:()}"{1}† 
  601. -> "1"{1}† 
  602. <- "1"{1}† 
  603. -> "2"{1}† 
  604. <- "2"{1}† 
  605. <- "3"{1}† 
  606. { = 3 }
  607.  
  608. Le mode pas à pas permet une grande souplesse grâce à l’utilisation des fermetures step?, stepin et stepout (en plus de la forme (step ƒ …) qui permet de désactiver localement le pas à pas).
  609.  
  610. Ainsi, après la définition:
  611.  
  612. (define (step? f e) 
  613.    (not (number? f)))
  614.  
  615. Le pas à pas précédent devient:
  616.  
  617. (step † (+ 7 12))        fl     19 et par exemple la session suivante:
  618. 1 -> "(+ 7 12)"{1}† 
  619. 2 -> "+"{1}† 
  620. 2 <- "{Closure:{Code 680xx for +} Env:()}"{1}† 
  621. 1 <- "19"{1}† 
  622. { = 19 }
  623.  
  624. 5.4 Les .i.fermetures; standards Help
  625.  
  626. 5.4.1 Booléens
  627.  
  628. Les deux constantes † et ƒ sont l’incarnation des .i.booléens;. Cependant, dans tous les tests effectués par Help, toute valeur différente de ƒ est considérée comme vrai (si ce n’est pas une erreur, auquel cas, le test échoue). En particulier, la liste vide est considérée comme vraie !
  629.  
  630. (.i.not; quelconque)    Fermeture:ProcN    1
  631.  
  632. Retourne † (vrai) si quelconque est égal à ƒ, sinon retourne ƒ.
  633.  
  634. (not †)            fl ƒ
  635. (not 3)            fl ƒ
  636. (not (list 1 2))    fl ƒ
  637. (not ƒ)            fl †
  638. (not ‘())        fl ƒ
  639.  
  640. (.i.boolean?; quelconque)    Fermeture:ProcN    1
  641.  
  642. Retourne † (vrai) si quelconque est égal à † ou ƒ. Retourne ƒ sinon.
  643.  
  644. (boolean? †)        fl †
  645. (boolean? 3)        fl ƒ
  646.  
  647. 5.4.2 Prédicats d’équivalence
  648.  
  649. Les trois .i.prédicats d’équivalence; eq?, =? et equal? définissent trois relations d’équivalence (réflexive, symétrique transitive) sur les objets Help. La relation d’équivalence définie par eq? est incluse dans celle définie par =? elle même incluse dans cell définie par equal?.
  650.  
  651. (.i.eq?; quelconque1 quelconque2)    Fermeture:ProcN    2
  652.  
  653. Retourne † (vrai) si les deux objets sont les mêmes (i.e existent à la même adresse en mémoire). Retourne ƒ autrement. Du fait de leur unicité, ce prédicat peut-être utilisé avec avantage sur les symboles.
  654.  
  655. (eq? ‘a ‘a)        fl †
  656. (eq? 1 2)        fl ƒ
  657. (eq? 1 1)        fl non défini
  658.  
  659. (.i.neq?; quelconque1 quelconque2)    Fermeture:ProcN    2
  660.  
  661. Retourne ƒ (faux) si les deux objets ne sont les mêmes (i.e existent à la même adresse en mémoire). Retourne † autrement. Du fait de leur unicité, ce prédicat peut-être utilisé avec avantage sur les symboles.
  662.  
  663. (neq? ‘a ‘a)        fl ƒ
  664. (neq? 1 2)        fl †
  665. (neq? 1 1)        fl non défini
  666.  
  667. (.i.=?; quelconque1 quelconque2)    Fermeture:ProcN    2
  668.  
  669. Retourne † (vrai) si les deux objets sont les mêmes (i.e existent à la même adresse en mémoire) ou si leur contenu est identique (au sens de eq? pour les structures de données référencant d’autres objets). Retourne ƒ autrement. Ce prédicat est avantageusement utilisable sur les nombres, les bit-arrays et les chaînes de caractères et dans certain cas sur les doublets, cellules….
  670.  
  671. (=? ‘a ‘a)        fl †
  672. (=? 1 2)        fl ƒ
  673. (=? 1 1)        fl †
  674. (=? %01 %01)        fl †
  675.  
  676. (.i.<>?; quelconque1 quelconque2)    Fermeture:ProcN    2
  677.  
  678. Retourne ƒ (faux) si les deux objets sont les mêmes (i.e existent à la même adresse en mémoire) ou si leur contenu est identique (au sens de eq? pour les structures de données référencant d’autres objets). Retourne † autrement. Ce prédicat est avantageusement utilisable sur les nombres, les bit-arrays et les chaînes de caractères  et dans certain cas sur les doublets, cellules….
  679.  
  680. (=? ‘a ‘a)                fl †
  681. (=? 1 2)                fl ƒ
  682. (=? 1 1)                fl †
  683. (=? %01 %01)                fl †
  684. (=? ‘(a | b) ‘(a | b))        fl †
  685.  
  686. (.i.equal?; quelconque1 quelconque2)    Fermeture:ProcN    2
  687.  
  688. Retourne † (vrai) si les deux objets sont équivalents (au sens de =?) ou, sinon, si leur contenu est identique (au sens de equal?). Retourne ƒ autrement. 
  689.  
  690. (equal? ‘a ‘a)            fl †
  691. (equal? 1 1)            fl †
  692. (equal? ‘(a b) ‘(a b))    fl †
  693.  
  694. (.i.nequal?; quelconque1 quelconque2)    Fermeture:ProcN    2
  695.  
  696. Retourne ƒ (faux) si les deux objets sont équivalents (au sens de =?) ou, sinon, si leur contenu est identique (au sens de equal?). Retourne † autrement.
  697.  
  698. (equal? ‘a ‘a)            fl †
  699. (equal? 1 1)            fl †
  700. (equal? ‘(a b) ‘(a b))    fl †
  701.  
  702.  
  703. 5.4.3 Listes et .i.doublets
  704.  
  705. Un doublet (ou paire pointée) est une structure de données hétérogène à deux champs appelés (pour des raisons historiques que je ne rappellerai pas …) CAR et CDR. Ces structures sont, à l’heure actuelle, modifiables.  L’accès aux champs d’un doublet se fait par les sélecteurs numériques.
  706.  
  707. L’utilisation principale des doublets est la représentation de .i.listes;. Une liste est définie comme étant soit la liste vide () soit un doublet dont le champ CDR est une liste. 
  708. La liste vide () est un objet à part, implémenté au moyen d’un symbole de constante. Elle ne contient pas d’élément et sa longueur est 0.
  709.  
  710. (.i.list?; quelconque)    Fermeture:ProcN    1
  711.  
  712. Retourne ƒ (faux) si quelconque n’est pas une liste (i.e. un doublet ou le symbole ()). Retourne † sinon.
  713.  
  714. (list? ‘())        fl †
  715. (list? ‘(1 2 3))    fl †
  716. (list? 3)        fl ƒ
  717.  
  718. (.i.cons?; quelconque)    Fermeture:ProcN    1
  719.  
  720. Retourne † (vrai) si quelconque est un doublet. Retourne ƒ sinon.
  721.  
  722. (cons? ‘())        fl ƒ
  723. (cons? ‘(1 2 3))    fl †
  724. (cons? 3)        fl ƒ
  725.  
  726. (.i.atom?; quelconque)    Fermeture:ProcN    1
  727.  
  728. Retourne ƒ (faux) si quelconque est un doublet. Retourne † sinon.
  729.  
  730. (atom? ‘())        fl †
  731. (atom? ‘(1 2 3))    fl ƒ
  732. (atom? 3)        fl †
  733.  
  734. (.i.cons; quelconque1 quelconque2)    Fermeture:ProcN    2
  735.  
  736. Retourne un doublet fraîchement alloué dont le CAR contient quelconque1 et le CDR quelconque2.  Le doublet est différent 5 de tout autre objet déjà existant.
  737.  
  738. (cons 1 2)        fl (1 | 2)
  739. (cons ‘a ‘())        fl (a)
  740. (cons ‘(a b) ‘c)    fl ((a b) | c)
  741.  
  742.  
  743. (.i.car=!; doublet quelconque)    Fermeture:ProcN    2
  744.  
  745. Permet d’écrire l’objet quelconque dans le champ CAR d’un doublet. Du fait de la paresse, des effets inattendus peuvent être observés. L’utilisation de cette fermeture est donc fortement déconseillée. Elle devrait disparaître dans les versions futures.
  746.  
  747. (car=! ‘(1 2) 3)    fl (3 2)
  748. (car=!  %1010 3)    fl ?:bad-type
  749.  
  750. (.i.cdr=!; doublet quelconque)    Fermeture:ProcN    2
  751.  
  752. Permet d’écrire l’objet quelconque dans le champ CDR d’un doublet. Du fait de la paresse, des effets inattendus peuvent être observés. L’utilisation de cette fermeture est donc fortement déconseillée. Elle devrait disparaître dans les versions futures.
  753.  
  754. (cdr=! ‘(1 2) 3)    fl (1 | 3)
  755. (cdr=!  %1010 3)    fl ?:bad-type
  756.  
  757. (.i.null?; quelconque)    Fermeture:ProcN    1
  758.  
  759. Retourne ƒ (faux) si quelconque n’est pas la liste vide. Retourne † sinon.
  760.  
  761. (null? ‘())        fl †
  762. (null? ‘(1 2 3))    fl ƒ
  763.  
  764. (.i.list; quelconque …)    Fermeture:NProc    0
  765.  
  766. Retourne la liste de ses arguments.
  767.  
  768. (list ‘ts (+ 24 3) ‘65)    fl (ts 27 65)
  769. (list)                fl ()
  770.  
  771. (.i.length; list)    Fermeture:ProcN    1
  772.  
  773. Retourne la longueur de list. La longueur d’une liste est définie récursivement par:
  774. t    la longueur de tout objet qui  n’est pas un doublet est 0;
  775. t    la longueur d’un doublet est 1 plus la longueur du CDR de ce doublet.
  776.  
  777. (length ‘())                fl 0
  778. (length ‘(1 2 3))            fl 3
  779. (length ‘(mcl (1 2 3) (a b)))    fl 3
  780. (length 1)                fl ?:bad-type
  781.  
  782.  
  783. (.i.append; list1 quelconque)    Fermeture:ProcN    2
  784.  
  785. Retourne une liste constituée des éléments de la première liste list1  suivi des éléments de la liste quelconque .Le second argument peut ne pas être une liste.
  786.  
  787. (append ‘(1 2 3) ‘(4 5 6))    fl (1 2 3 4 5 6)
  788. (append ‘() ‘(a b))        fl (a b)
  789. (append ‘(a b) ‘(c | d))    fl (a b c | d)
  790.  
  791. (.i.∞; quelconque)    Fermeture:ProcN    1
  792.  
  793. Retourne une liste infinie constituée uniquement de la valeur de quelconque.
  794.  
  795. (∞ 1)        fl (1 1 1 1 1 1…)
  796. (∞ (+ 2 3))    fl (5 5 5 5 5 5…)
  797.  
  798. (.i.…; nombre)    Fermeture:ProcN    1
  799.  
  800. Retourne une liste infinie constituée des entiers à partir de nombre.
  801.  
  802. (… 1)        fl (1 2 3 4 5 6…)
  803. (… (- -2 1))    fl (-3 -2 -1 0 1 2…)
  804.  
  805.  
  806. 5.4.4 Symboles
  807.  
  808. Les .i.symboles; sont des objets dont l’utilisation principale repose sur le fait que deux symboles sont identiques (dans le sens de eq? ou =?) si ils ont le même nom. Cette propriété étant particulièrement utile pour les identificateurs de variables ou de constantes, Help utilise les symboles pour représenter ces identificateurs ainsi que les erreurs.
  809.  
  810. (.i.symbol?; quelconque)    Fermeture:ProcN    1
  811.  
  812. Retourne † (vrai) si quelconque  est un symbole, sinon retourne l’objet quelconque.
  813.  
  814. (.i.intern; symbole quelconque)    Fermeture:ProcN    2
  815.  
  816. Retourne un symbole de nom quelconque  (qui doit être une chaîne ou un symbole)  et de père (dans la hiérarchie des symboles) symbole.
  817.  
  818. (intern ‘père “fils”)    fl père:fils
  819. (intern ‘père ‘fils)    fl père:fils
  820.  
  821.  
  822. 5.4.5 Nombres
  823.  
  824. Suivant leur position, les .i.nombres; peuvent être interprétés comme fonctions (sélecteurs numériques) ou comme données numériques. Ce double rôle peut être considéré comme une faiblesse sémantique mais représente un grand confort du point de vue pragmatique.
  825.  
  826. L’utilisation d’un nombre entier de taille fixe en tant que sélecteur numérique sur une liste ou cellule est  détaillée dans le §5.3FR.
  827.  
  828. (.i.+; nombre nombre)    Fermeture:ProcN    2
  829.  
  830. Retourne la somme de ses arguments. Si l’un des deux arguments est flottant, le résultat sera flottant. 
  831. (+ 10 10)        fl 20
  832. (+ 1 2.312)        fl 3.312000000000000e+00
  833. (+ 9999999999 1)    fl 10000000000
  834. (+ 1 ‘a)        fl ?:bad-type
  835.  
  836. (.i.-; nombre nombre)    Fermeture:ProcN    2
  837.  
  838. Retourne la différence de ses arguments. Si l’un des deux arguments est flottant, le résultat sera flottant. 
  839.  
  840. (- 10 10)        fl 0
  841. (- 2.312 1)        fl 1.312000000000000e+00
  842. (- 9999999999 1)    fl 9999999998
  843. (- 1 ‘a)        fl ?:bad-type
  844.  
  845. (.i.1+; nombre)    Fermeture:ProcN    1
  846.  
  847. Retourne le résultat de l’incrémentation de son argument. 
  848.  
  849. (1+ 10)        fl 11
  850. (1+ %)        fl %00000000000000000000000000000001
  851. (1+ ‘a)        fl ?:bad-type
  852.  
  853. (.i.1-; nombre)    Fermeture:ProcN    1
  854.  
  855. Retourne le résultat de la décrémentation de son argument. 
  856.  
  857. (1- 10)        fl 9
  858. (1- ‘a)        fl ?:bad-type
  859.  
  860. (.i.*; nombre1 nombre2)    Fermeture:ProcN    2
  861.  
  862. Retourne le produit de ses arguments. Si l’un des arguments est flottant, il y aura conversion en flottant de l’autre argument et calcul du produit en flottant.
  863.  
  864. (* 10 23)    fl 230
  865. (* ‘a 2)    fl ?:bad-type
  866. (* 1e10 2)    fl 2.000000000000000e10
  867.  
  868. (.i./; smallnum1 smallnum2)    Fermeture:ProcN    2
  869.  
  870. Retourne le quotient (entier si les deux arguments sont entiers) de ses arguments. Si l’un des arguments est flottant, il y aura conversion en flottant de l’autre argument et calcul du produit en flottant.
  871.  
  872. (/ 23 10)        fl 2
  873. (/ ‘a 2)        fl ?:bad-type
  874. (/ 23 10.0)        fl 2.300000000000000e0
  875.  
  876. (.i.modulo; fix1 fix2)    Fermeture:ProcN    2
  877.  
  878. Retourne le reste du quotient de fix1  par fix2.
  879.  
  880. (modulo 23 10)    fl 3
  881. (modulo ‘a 2)    fl ?:bad-type
  882.  
  883. (.i.<?; nombre1 nombre2)    Fermeture:ProcN    2
  884.  
  885. Retourne ƒ si  nombre1  n’est pas strictement inférieur à nombre2. Retourne nombre1  sinon.
  886.  
  887. (<? 23 10)        fl ƒ
  888. (<? ‘a 2)        fl ?:bad-type
  889. (<? 12 20)        fl 12
  890.  
  891. (.i.>?; nombre1 nombre2)    Fermeture:ProcN    2
  892.  
  893. Retourne ƒ si  nombre1  n’est pas strictement supérieur à nombre2. Retourne nombre1  sinon.
  894.  
  895. (>? 23 10.0)            fl 23
  896. (>? ‘a 2)            fl ?:bad-type
  897. (>? 20 12345678987654321)    fl ƒ
  898.  
  899. (.i.zero?; nombre)    Fermeture:ProcN    1
  900.  
  901. Retourne ƒ si  nombre n’est pas égal à zéro. Retourne nombre sinon. 
  902.  
  903. (zero? 0)        fl 0
  904. (zero? ‘a)        fl ?:bad-type
  905.  
  906. (.i.float; nombre)    Fermeture:ProcN    1
  907.  
  908. Retourne le résultat de la conversion de nombre  en flottant.
  909.  
  910. (float 0)        fl 0.00000000000e+0
  911.  
  912. (.i.cos; nombre)    Fermeture:ProcN    1
  913.  
  914. Retourne le cosinus (en flottant) de nombre  exprimé en radians.
  915.  
  916. (.i.sin; nombre)    Fermeture:ProcN    1
  917.  
  918. Retourne le sinus (en flottant) de nombre  exprimé en radians.
  919.  
  920. (.i.tan; nombre)    Fermeture:ProcN    1
  921.  
  922. Retourne la tangente (en flottant) de nombre  exprimé en radians.
  923.  
  924. (.i.acos; nombre)    Fermeture:ProcN    1
  925.  
  926. Retourne l’arc-cosinus (en flottant) de nombre .
  927.  
  928. (.i.asin; nombre)    Fermeture:ProcN    1
  929.  
  930. Retourne le l’arc-sinus (en flottant) de nombre.
  931.  
  932. (.i.atan; nombre)    Fermeture:ProcN    1
  933.  
  934. Retourne l’arc-tangente (en flottant) de nombre.
  935.  
  936. (.i.cosh; nombre)    Fermeture:ProcN    1
  937.  
  938. Retourne le cosinus hyperbolique (en flottant) de nombre.
  939.  
  940. (.i.sinh; nombre)    Fermeture:ProcN    1
  941.  
  942. Retourne le sinus hyperbolique (en flottant) de nombre.
  943.  
  944. (.i.tanh; nombre)    Fermeture:ProcN    1
  945.  
  946. Retourne la tangente hyperbolique (en flottant) de nombre.
  947.  
  948. (.i.atanh; nombre)    Fermeture:ProcN    1
  949.  
  950. Retourne l’arc-tangente hyperbolique (en flottant) de nombre.
  951.  
  952. (.i.log; nombre)    Fermeture:ProcN    1
  953.  
  954. Retourne le logarithme népérien (en flottant) de nombre.
  955.  
  956. (.i.exp; nombre)    Fermeture:ProcN    1
  957.  
  958. Retourne l’exponentielle (en flottant) de nombre.
  959.  
  960. (.i.sqrt; nombre)    Fermeture:ProcN    1
  961.  
  962. Retourne la racine carrée (en flottant) de nombre.
  963.  
  964. (.i.ibase; fixpos)    Fermeture:ProcN    1
  965.  
  966. Modifie la base de lecture courante du lecteur. Le fixpos  doit être compris entre 2 et 36. Retourne la valeur de son argument. Voir §5.2.1FR.
  967.  
  968. (ibase 10)        fl 10
  969.  
  970. 5.4.6 Fermetures
  971.  
  972. Les fermetures sont le produit cartésien d’un “code” qui attend une séquence d’expression et d’un environnement. A des fins d’optimisation, chaque fermeture est accompagné d’un tableau de 16 bits indiquant si la fermeture est stricte par rapport aux 15 premiers arguments (15 premiers bits) et aux suivants (dernier bit). Ce tableau est automatiquement généré par le compilateur (dans un certaine mesure seulement) mais pas par l’interprète.
  973.  
  974.  
  975. (.i.apply; applicable liste)    Fermeture:ProcN    2
  976.  
  977. Applique la fermeture ou le sélecteur numérique applicable  à la liste d’arguments liste. 
  978.  
  979. (apply 1 ‘((a)))        fl a
  980. (apply + ‘(1 2))        fl 3
  981.  
  982. (.i.getcode; fermeture)    Fermeture:ProcN    1
  983.  
  984. Retourne le code (interprété ou compilé) de la fermeture.
  985.  
  986. (getcode 1+)            fl {Code 680xx for 1+}
  987. (getcode (lambda(x)x))    fl ((x) x)
  988.  
  989. (.i.getenv; fermeture)    Fermeture:ProcN    1
  990.  
  991. Retourne l’environnement capturé par la fermeture.
  992.  
  993. (getenv 1+)            fl ()
  994. (getenv
  995.    (let [(x 2)]
  996.       (lambda(x)x)))        fl {Env: «x=2» Then ()}
  997.  
  998. (.i.getstrict; fermeture)    Fermeture:ProcN    1
  999.  
  1000. Retourne le bit-array associée à la fermeture en relation avec le caractère strict de la fermeture sur le nième argument.
  1001.  
  1002. (getstrict cons)        fl %00000000000000000000000000000000
  1003. (getstrict +)            fl %11000000000000000000000000000000
  1004.  
  1005. (.i.setstrict; fermeture bitarray)    Fermeture:ProcN    2
  1006.  
  1007. Permet de fixer le bit-array associée à la fermeture en relation avec le caractère strict de la fermeture sur le nième argument. Permet d’améliorer le temps de calcul et la place mémoire consommée si la fonction est stricte par rapport à certains de ses arguments.
  1008.  
  1009. 5.4.7 Macros
  1010.  
  1011. (.i.expand; liste)    Fermeture:ProcN    1
  1012.  
  1013. La liste  doit représenter un appel à une macro “quoté”. Retourne le résultat de l’expansion de la macro.
  1014.  
  1015. (expand ‘(quasiquote (a (unquote b))))    fl (list ‘a b)
  1016.  
  1017.  
  1018. 5.4.8 Cellules
  1019.  
  1020. Les .i.cellules; sont des structures hétérogènes indexées par des entiers. Ces structures (tout comme les doublets) sont, à l’heure actuelle, modifiables après leur création. Du fait de la paresse, il est fortement déconseillé d’utiliser ces mécanisme d’écriture.
  1021.  
  1022. Lors de l’accès par les sélecteurs numériques, le premier élément d’une cellule est indexé par zéro et le dernier par la longueur de la cellule moins un. La longueur d’une cellule peut être obtenue en appelant la fermeture blength et en soustrayant 1 au résultat obtenu.
  1023.  
  1024.  
  1025. (.i.cell?; quelconque)    Fermeture:ProcN    1
  1026.  
  1027. Retourne ƒ (faux) si quelconque n’est pas une cellule, sinon retourne la cellule elle-même.
  1028.  
  1029. (cell? 23)        fl ƒ
  1030. (cell? [1 2 3])    fl [1 2 3]
  1031.  
  1032. (.i.cell; quelconque …)    Fermeture:NProc    0
  1033.  
  1034. Retourne une cellule dont le contenu est quelconque ….
  1035.  
  1036. (cell 0 1 2)            fl [0 1 2]
  1037. (cell ‘d ‘e 1 ‘(a) [1])    fl [d e 1 (a) [1]]
  1038.  
  1039. (.i.makecell; fixpos)    Fermeture:ProcN    1
  1040.  
  1041. Retourne une cellule de taille fixpos  et dont les champs sont tous initialisés à ?.
  1042.  
  1043. (makecell 2)            fl [? ?]
  1044.  
  1045. (.i.cell=!; cellule fixpos quelconque)    Fermeture:ProcN    3
  1046.  
  1047. Ecrit quelconque dans cellule à la position fixpos. Retourne la cellule ainsi modifiée. Cette instruction ayant des effets de bords importants est d’un usage difficile et déconseillé du fait de la paresse.
  1048.  
  1049. (cell=! ‘[a b c] 0 0)    fl [0 b c]
  1050. (cell=! [0 1 2] 3 1)    fl ?:indx-out
  1051.  
  1052.  
  1053. 5.4.9 Environnements
  1054.  
  1055. La forme syntaxique bindings permet de référencer l’.i.environnement; courant. Une série de fermetures permet de manipuler cet environnement, ou d’en créer de nouveaux… Les sélecteurs numériques permettent de manipuler les environnements (non vides). A l’index zéro se trouve l’environnement inférieur, ensuite on trouve les valeurs puis les variables.
  1056.  
  1057.  
  1058. (.i.environment?; quelconque)    Fermeture:ProcN    1
  1059.  
  1060. Retourne ƒ (faux) si quelconque n’est pas un environnement, sinon retourne l’environnement lui-même. La forme syntaxique bindings retournant () si l’environnement courant est l’environnement global, la liste vide est considérée comme environnement.
  1061.  
  1062. (environment? 23)                fl ƒ
  1063. (environment? ‘())                fl ()
  1064. (environment (let [(x 2)] (bindings)))    fl {Env: «x=2» Then ()}
  1065.  
  1066. (.i.binding=?; ident environ)    Fermeture:ProcN    2
  1067.  
  1068. Retourne la valeur de ident  dans environ . Si la variable n’est pas définie dans l’environnement, il y retour de l’erreur  ?:varundef.
  1069.  
  1070. (binding=? ‘1+ ‘())                fl {Code6800x for 1+}
  1071. (binding=? ‘x (let [(x 2)] (bindings)))    fl 2
  1072. (binding=? ‘a ‘())                fl ?:varundef
  1073.  
  1074. (.i.binding=!; ident environ quelconque)    Fermeture:ProcN    3
  1075.  
  1076. Modifie la valeur de ident  dans environ. Retourne la valeur de environ.
  1077.  
  1078. (binding=! ‘1+ ‘() 2)            fl ()
  1079. (binding=! ‘a ‘() 2)            fl ()
  1080.  
  1081. (.i.makeenv; ident1 …)    Fermeture:NProc    0
  1082.  
  1083. Retourne un environnement dans lequel les ident sont liés à  ?. Cet environnement est automatiquement étendu avec l’environnement courant.
  1084.  
  1085. (makeenv ‘a ‘b)    fl {Env: «a=?» «b=?» Then ()}
  1086. (makeenv 1)        fl ?:bad-type
  1087.  
  1088. (.i.envar; environ)    Fermeture:ProcN    1
  1089.  
  1090. Retourne une cellule contenant tous les identificateurs de l’environnement environ.  Utile essentiellement durant le déverminage (sous debugger) pour examiner l’environnement sans forcer le calcul des valeurs.
  1091.  
  1092. (envar (makeenv ‘a ‘b))    fl [a b]
  1093.  
  1094. 5.4.10 Tableau de bits
  1095.  
  1096. Les tableaux de bits permettent une économie de mémoire importante dans la représentation des booléens. Ils permettent également une représentation efficace des ensembles et une manipulation aisée (intersection, union…). Les opérations sur les tableaux sont destructives (effets de bords) pour des raisons d’efficacité, une utilisation fonctionnelle peut aisément être réalisée au moyen de la fermeture bcopy.
  1097.  
  1098. La lecture d’un tableau de bits se fait au moyen des sélecteurs numériques
  1099.  
  1100. (.i.bitarray?; quelconque)    Fermeture:ProcN    1
  1101.  
  1102. Retourne ƒ (faux) si quelconque n’est pas un tableau de bits, sinon retourne le tableau lui-même.
  1103.  
  1104. (bitarray? 23)    fl ƒ
  1105. (bitarray? %)    fl %
  1106.  
  1107.  
  1108. (.i.makebitarray; posfix)    Fermeture:ProcN    1
  1109.  
  1110. Retourne un tableau de bits de longueur au moins égale à posfix où tous les bits sont initialisés à 0.
  1111.  
  1112. (makebitarray 0)    fl %
  1113. (makebitarray 10)    fl %00000000000000000000000000000000
  1114.  
  1115. (.i.bitand!; bitarray1 bitarray2)    Fermeture:ProcN    2
  1116.  
  1117. Effectue le ET logique entre bitarray1 et  bitarray2. Le résultat est stocké dans le second tableau. Si les tableaux sont de tailles différentes, l’opération est limitée au plus petit. Cette opération ayant des effets de bords, il est conseillé de faire une copie du second tableau pour appliquer cette fermeture.
  1118.  
  1119. (bitand! %0011 %0101)    fl %00010000000000000000000000000000
  1120.  
  1121. (.i.bitor!; bitarray1 bitarray2)    Fermeture:ProcN    2
  1122.  
  1123. Effectue le OU logique entre bitarray1 et  bitarray2. Le résultat est stocké dans le second tableau. Si les tableaux sont de tailles différentes, l’opération est limitée au plus petit. Cette opération ayant des effets de bords, il est conseillé de faire une copie du second tableau pour appliquer cette fermeture.
  1124.  
  1125. (bitor! %0011 %0101)    fl %01110000000000000000000000000000
  1126.  
  1127. (.i.bitxor!; bitarray1 bitarray2)    Fermeture:ProcN    2
  1128.  
  1129. Effectue le ou exclusif logique entre bitarray1 et  bitarray2. Le résultat est stocké dans le second tableau. Si les tableaux sont de tailles différentes, l’opération est limitée au plus petit. Cette opération ayant des effets de bords, il est conseillé de faire une copie du second tableau pour appliquer cette fermeture.
  1130.  
  1131. (bitor! %0011 %0101)    fl %01100000000000000000000000000000
  1132.  
  1133. (.i.bitnot!; bitarray)    Fermeture:ProcN    1
  1134.  
  1135. Effectue la négation logique de bitarray. Le résultat est stocké dans bitarray. Cette opération ayant des effets de bords, il est conseillé de faire une copie du tableau pour appliquer cette fermeture.
  1136.  
  1137. (bitnot! %01)    fl %10111111111111111111111111111111
  1138.  
  1139. (.i.bitcount; bitarray)    Fermeture:ProcN    1
  1140.  
  1141. Retourne le nombre de bits à 1 dans bitarray. Temps d’exécution proportionnel au nombre de 1.
  1142.  
  1143. (bitcount %0101)    fl 2
  1144.  
  1145.  
  1146. (.i.bitfind; bitarray)    Fermeture:ProcN    1
  1147.  
  1148. Retourne la position du premier bit à 1 dans bitarray si il y en a un. Retourne ƒ sinon.
  1149.  
  1150. (bitfind %0001)    fl 3
  1151. (bitfind %)        fl ƒ
  1152.  
  1153. (.i.bitset!; bitarray fixpos)    Fermeture:ProcN    2
  1154.  
  1155. Positionne (met à 1) le bit  à la position fixpos du  bitarray . Retourne le tableau modifié.Cette opération ayant des effets de bords, il est conseillé de faire une copie du tableau pour appliquer cette fermeture.
  1156.  
  1157. (bitset! %0 0)    fl %10000000000000000000000000000000
  1158.  
  1159. (.i.bitclr!; bitarray fixpos)    Fermeture:ProcN    2
  1160.  
  1161. Efface (met à 0) le bit  à la position fixpos du  bitarray . Retourne le tableau modifié.Cette opération ayant des effets de bords, il est conseillé de faire une copie du tableau pour appliquer cette fermeture.
  1162.  
  1163. (bitclr! %1 0)    fl %00000000000000000000000000000000
  1164.  
  1165. (.i.bitchg!; bitarray fixpos)    Fermeture:ProcN    2
  1166.  
  1167. Change la valeur du bit à la position fixpos du  bitarray . Retourne le tableau modifié.Cette opération ayant des effets de bords, il est conseillé de faire une copie du tableau pour appliquer cette fermeture.
  1168.  
  1169. (bitchg! %0 0)    fl %10000000000000000000000000000000
  1170.  
  1171. (.i.zero?; bitarray)    Fermeture:ProcN    1
  1172.  
  1173. Retournera ƒ si un des bits de bitarray est positionné. Retourne bitarray  sinon.
  1174.  
  1175. (zero? %00010)    fl ƒ
  1176. (zero? %000)    fl %00000000000000000000000000000000
  1177.  
  1178. 5.4.11 Entrées-Sorties
  1179.  
  1180. Les entrées sorties sont faites via des unités d’.i.entrée/sortie;. Ces unités peuvent représenter un fichier ou une fenêtre de l’éditeur. Comme en C, les variables  .i.stdi;, .i.stdo ;et .i.stder ;dénotent (normalement) les unités (resp.) d’entrée, de sortie et d’erreur. Au démarrage, stdi et stdo sont associées à la fenêtre courante et stder à la fenêtre “Transcript”. Il est possible de modifier le contenu de ces variables afin de détourner les flots d’entrée/sortie vers ou en provenance d’un fichier…
  1181.  
  1182.  
  1183. (.i.read;)    Fermeture:ProcN    0
  1184.  
  1185. Lit une expression Help sur le flot d’entrée courant (contenu dans la variable stdi). Retourne la représentation interne de l’expression lue.
  1186.  
  1187. (.i.print; quelconque)    Fermeture:ProcN    1
  1188.  
  1189. Imprime la représentation externe de quelconque  sur le flot de sortie courant (contenu dans la variable stdo) et passe à la ligne suivante (émission d’un retour chariot). Il faut noter que l’imprimeur Help va forcer toutes les suspensions nécessaires afin de pouvoir afficher l’objet dans sa complétude. Si l’on désire afficher l’objet dans son état courant, utiliser la fonction printdebug. Retourne ?.
  1190.  
  1191. (.i.prin; quelconque)    Fermeture:ProcN    1
  1192.  
  1193. Imprime la représentation externe de quelconque  sur le flot de sortie courant (contenu dans la variable stdo). Il faut noter que l’imprimeur Help va forcer toutes les suspensions nécessaires afin de pouvoir afficher l’objet dans sa complétude. Si l’on désire afficher l’objet dans son état courant, utiliser la fonction printdebug. Retourne ?.
  1194.  
  1195. (.i.prinlength; fixpos)    Fermeture:ProcN    1
  1196.  
  1197. Permet de fixer la longueur maximale d’impression en nombre d’objets imprimés. Particulièrement utile lors de l’impression d’objets infinis. Retourne la valeur de son argument.
  1198.  
  1199.  
  1200. (.i.prindepth; fixpos)    Fermeture:ProcN    1
  1201.  
  1202. Permet de fixer la profondeur maximale d’impression en nombre d’objets imprimés. Particulièrement utile lors de l’impression d’objets infinis. Retourne la valeur de son argument.
  1203.  
  1204. (.i.openi; chaîne)    Fermeture:ProcN    1
  1205.  
  1206. Ouvre en lecture seulement le fichier dont le chemin d'accès est indiqué dans chaîne . Le chemin d'accès est spécifié en séparant les dossiers par des “:”. Le dossier d’où a été lancé l’évaluateur est le dossier par défaut. Retourne une unité d’entrée associée  à ce fichier.
  1207.  
  1208. (openi “bob”)    fl «IO-Unit»
  1209.  
  1210. (.i.openo; chaine)    Fermeture:ProcN    1
  1211.  
  1212. Ouvre en lecture-écriture le fichier dont le chemin d'accès est indiqué dans chaîne . Le chemin d'accès est spécifié en séparant les dossiers par des “:”. Le dossier d’où a été lancé l’évaluateur est le dossier par défaut. Retourne une unité d’entrée associée  à ce fichier.
  1213.  
  1214. (openo “deux-pierre”)    fl «IO-Unit»
  1215.  
  1216. (.i.close; iounit)    Fermeture:ProcN    1
  1217.  
  1218. Ferme le fichier associé à iounit . Retourne ?. Toute tentative de lecture ou d’écriture sur une unité d’entrée/sortie fermée se soldera par une erreur ?:bad-type.
  1219.  
  1220. (.i.prinio; quelconque  iounit)    Fermeture:ProcN    2
  1221.  
  1222. Imprime la représentation externe de quelconque  sur l’unité de sortie  iounit. Il faut noter que l’imprimeur Help va forcer toutes les suspensions nécessaires afin de pouvoir afficher l’objet dans sa complétude. Si l’on désire afficher l’objet dans son état courant, utiliser la fonction printdebug. Retourne ?.
  1223.  
  1224. (.i.readio; iounit)    Fermeture:ProcN    1
  1225.  
  1226. Lit une expression Help sur le flot d’entrée iounit. Retourne la représentation interne de l’expression lue. Retourne l’erreur  ?:eof-error lors que la fin d’un fichier est atteinte.
  1227.  
  1228. (.i.flushio; iounit)    Fermeture:ProcN    1
  1229.  
  1230. Vide les “buffers”  associés à iounit. Permet en particulier de mettre à jour l’affichage lorsqu’une unité d’I/O est associée à une fenêtre.
  1231.  
  1232. (.i.load; chaine)    Fermeture:ProcN    1
  1233.  
  1234. Ouvre le fichier dont le chemin d'accès est indiqué dans chaîne , évalue son contenu et ferme le fichier.
  1235.  
  1236.  
  1237. 5.4.12 Erreurs et gestion d’.i.erreurs
  1238.  
  1239.  
  1240. (.i.printdebug; quelconque)    Fermeture:ProcN    1
  1241.  
  1242. Affiche sur l’unité d’entrée/sortie référencée par stder la forme externe de quelconque  sans forcer les suspensions que peut contenir l’objet suivie d’un retour chariot. Une suspension est affichée avec le code suspendu et l’environnement capturé. Retourne ?.
  1243.  
  1244. (printdebug (cons a b))    affichera  ({Susp: a in ()} | {Susp: b in ()})
  1245.  
  1246. (.i.error; erreur quelconque)    Fermeture:ProcN    2
  1247.  
  1248. Emet l’erreur erreur avec le message quelconque. Suivant le mode courant de traitement de l’erreur, il peut y avoir impression, appel du “debugger” ou juste retour d’une valeur… 
  1249.  
  1250. (.i.error?; quelconque)    Fermeture:ProcN    1
  1251.  
  1252. Retourne † si la valeur de quelconque est du type “erreur” (Cf la fermeture type). Retourne ƒ sinon.
  1253.  
  1254. (error? 1)        fl    ƒ
  1255. (error? (1+ ‘a))    fl    †
  1256.  
  1257. (.i.explain; erreur)    Fermeture:ProcN    1
  1258.  
  1259. Retourne le message d’erreur associé à l’erreur.
  1260.  
  1261. (explain ‘?:varundef)    fl "Variable non définie"
  1262.  
  1263.  
  1264. 5.4.13 .Contrôle
  1265.  
  1266. Les fermetures de .i.contrôle ;sont peu nombreuses en Help. Comme nous le verrons au §6.2.2FR l’introduction d’échappement ou de continuations (à la Scheme) n’apporte que peu de choses dans un contexte d’évaluation paresseuse non parallèle. Cependant, la fermeture force permet de redonner aux échappements toutes leurs fonctionnalités, la primitive call/ep permettant de réaliser de tels échappements (efficace mais d’utilisation très limitée); la fermeture call/cc permettant de capturer la continuation courante (à la Scheme).
  1267.  
  1268. (.i.call/ep; fermeture)    Fermeture:ProcN    1
  1269.  
  1270. Passe à la fermeture  (qui doit pouvoir accepter un seul argument) une fermeture de type ProcN, d’arité 1 qui permettra de s’échapper en retournant la valeur passée en argument (comme call/cc en Scheme). Cependant, cette “continuation chronologique” a une durée de vie limitée6 (écrasement des piles) et ne permet pas de faire du “backtracking” non chronologique.
  1271.  
  1272. (call/ep (lambda(k)(k 1) 2))    fl 1
  1273.  
  1274. (.i.call/cc; fermeture)    Fermeture:ProcN    1
  1275.  
  1276. Passe à la fermeture  (qui doit pouvoir accepter un seul argument) une fermeture de type ProcN, d’arité 1 qui passera la valeur argument à la continuation capturée lors du call/cc (comme call/cc en Scheme). Cette continuation a une durée de vie illimitée mais peut occuper une importante quantité de place mémoire et sa capture comme son appel peuvent nécessiter un temps machine important.
  1277.  
  1278. (call/cc (lambda(k)(k 1) 2))    fl 1
  1279.  
  1280. (.i.force; quelconque)    Fermeture:ProcN    1
  1281.  
  1282. D’un point du vue fonctionnel, c’est la fonction identité. Cependant, elle accède récursivement à toutes les suspensions que pourraient contenir ou référencer quelconque. Elle permet essentiellement de simuler la transformation des suspensions Help en “futures” d’une machine parallèle et de redonner à certains traits sales de Help (affectation, échappements…)  toutes leurs fonctionnalités.
  1283.  
  1284. (=! x 2)                fl 2
  1285. (=! x (force (cons 1 x)))        fl (1 | 2)    ;et non (1 1 1 1 1 1 1 1…)
  1286. (force
  1287.    (call/cc 
  1288.      (lambda(k)
  1289.        (cons 1 (k ‘Sortir)))))    fl Sortir    ;et non (1 | <teratos>)
  1290.  
  1291.  
  1292. (.i.if; quelconque1 quelconque2 …)    Fermeture:NProc    0
  1293.  
  1294. Comme l’indique le §3.4.2, la conditionnelle peut être implémentée sous forme de fermeture en Help. La fermeture Help représente l’incarnation sous forme de fermeture de la forme syntaxique cond (qui est plus efficace et conservée à ce seul titre dans l’interprète).
  1295.  
  1296. (if (eq? ‘a ‘b) 1
  1297.     (=? 1 2)    2
  1298.     3)                fl 3
  1299.  
  1300. (.i.eval; quelconque environ)    Fermeture:ProcN    2
  1301.  
  1302. Dans la version “interprétée” de Help, cette fermeture réalise l’évaluation de la forme quelconque  dans l’environnement environ.  Dans la version “compilée”, elle devrait compiler la forme quelconque  dans l’environnement environ  et lancer l’exécution du code compilé généré. A noter que si quelconque  est déjà une forme compilée (objet de type CODE) il y a exécution immédiate du code dans l’environnement fourni. Ceci permet une utilisation de EVAL rapide si il y a eu précompilation.
  1303.  
  1304. (eval 1 ‘())                         fl 1
  1305. (eval (cons x x) ((lambda(x) (bindings)) ‘a))     fl (a | a)
  1306.  
  1307. (.i.or; quelconque1…)    Fermeture:NProc    0
  1308.  
  1309. Evalue les formes quelconque1…  en séquence jusqu'à ce que une des formes retourne une valeur vraie. Dans ce cas, retourne cette valeur, sinon retourne ƒ.
  1310.  
  1311. (or (null? ‘a) (null? ‘()))         fl †
  1312. (or (number? ‘a) (number? 1.1))    fl 1.100000000000000e00
  1313.  
  1314.  
  1315. (.i.and; quelconque1…)    Fermeture:NProc    0
  1316.  
  1317. Evalue les formes quelconque1…  en séquence jusqu'à ce que une des formes retourne une valeur fausse. Dans ce cas, retourne ƒ,  sinon retourne la dernière valeur retournée.
  1318.  
  1319. (and (null? ‘a) (null? ‘()))     fl ƒ
  1320. (and (number? 10) (number? 1.1))    fl 1.100000000000000e00
  1321.  
  1322.  
  1323. 5.4.14 Système
  1324.  
  1325. Nous regroupons ici toutes les fermetures ayant un rapport avec le système de gestion de mémoire ou avec le système d’exploitation et le matériel.
  1326.  
  1327. (.i.type; quelconque)    Fermeture:ProcN    1
  1328.  
  1329. Retourne le type (contenu dans le “tag” du bloc référencé) de quelconque sous forme numérique (fix). La table suivante, ou plus simplement l’application de la fermeture type à un objet constant permettent les comparaisons.
  1330.  
  1331. entier taille fixe    1    nombre flottant    2
  1332. tableau de bits    3    chaîne    4
  1333. unité d’entrées/sorties    5    identificateur de variable    6
  1334. identificateur de constante    7    erreurs    8
  1335. macros    9    mot clé    10
  1336. code    11    fermeture    12
  1337. doublet    13    cellule    14
  1338. indirection7    15    environnement    16
  1339. environnement  court    17    nombre entier en précision illimitée    19
  1340. forme suspendue mémoïzable8    20    forme suspendue9    21
  1341.  
  1342. (type ‘a)                fl 6
  1343. (type (+ 9999999999 1))        fl 19
  1344.  
  1345. (.i.coerce; quelconque fixpos)    Fermeture:ProcN    2
  1346.  
  1347. Change le type de quelconque en fixpos . Utiliser la fonction type pour connaître les types possibles. Cette fonction peut tromper le Glaneur de Cellules en le forçant à libérer des blocs référençables ou à libérer des blocs qui n’existent pas ceci pouvant entraîner des erreurs terminales (Bus Error, Adress Error…). Les conversions de type sont possibles sans danger entre les différents éléments de chacun des groupes de types suivants:
  1348.  
  1349. t    1 2 3 4 19     nombres et bit-arrays
  1350. t    6 7 8 9 10     identificateurs…
  1351. t    16 17 14     environnements et cellules
  1352.  
  1353. (.i.runtime;)    Fermeture:ProcN    0
  1354.  
  1355. Retourne le temps écoulé en 1/60 secondes depuis le démarrage du système.
  1356.  
  1357. (.i.chrono; quelconque)    Fermeture:ProcN    1
  1358.  
  1359. Retourne une cellule de trois éléments. Le premier élément est la valeur de quelconque. Le second représente le temps pris (en secondes, et à 1/60 de secondes près) pour évaluer la forme quelconque  (attention, une impression peut être nécessaire pour forcer un objet dans sa complétude) et le dernier représente le temps passé en Glanage de Cellules. Noter que chrono effectue un Glanage de Cellules compacifiant AVANT d’évaluer la forme quelconque  afin d’avoir une plus grande régularité dans ses résultats (le temps pris pour effectuer ce GC n’est évidemment pas pris en compte…). Si la forme quelconque  déclenche un GC via l’utilisation des fermetures compgc ou masgc,  les résultats retournés ne tiendront pratiquement pas compte du temps pris par ce GC.
  1360.  
  1361. (chrono (fib 20))     fl [10946 6.45000000000e+0 0.000000000000e+0]
  1362.  
  1363. (.i.masgc;)    Fermeture:ProcN    0
  1364.  
  1365. Fait appel au Glaneur de Cellules afin qu’il effectue un ramassage de type “Mark and Sweep”. Ce GC très rapide ne diminue pas la fragmentation. Il supprime cependant tous les blocs de type “indirection” que pourraient avoir installé les suspensions forcées ou la fermeture replace. Les blocs isolés de taille 1 ou 2 ne sont pas récupérés. Les symboles dont la valeur est indéfinie et qui ne sont plus référencées sont récupérés. La valeur retournée est  ?.
  1366.  
  1367. (.i.compgc;)    Fermeture:ProcN    0
  1368.  
  1369. Fait appel au Glaneur de Cellules afin qu’il effectue un ramassage de type “Break Table modifié”. Ce GC compacifiant est plus lent et diminue la fragmentation. Il supprime tous les blocs de type “indirection” que pourraient avoir installé les suspensions forcées ou la fermeture replace. Les symboles dont la valeur est indéfinie et qui ne sont plus référencées sont récupérés. La valeur retournée est  ?.
  1370.  
  1371. (.i.blength; quelconque)    Fermeture:ProcN    1
  1372.  
  1373. Retourne la quantité de place mémoire occupé par quelconque en mot longs (32 bits).La place occupé par le “tag” associé à chaque bloc n’est pas prise en compte.
  1374.  
  1375. (blength ‘a)        fl 6
  1376. (blength 2)        fl 1
  1377.  
  1378. (.i.bcopy; quelconque)    Fermeture:ProcN    1
  1379.  
  1380. Retourne une copie de l’objet quelconque . Cette copie est surfacique (copie de l’objet seulement et non des objets référencés par quelconque ). Cette fonction ne doit pas être employée sur les objets dont l’unicité est préservée par le système (symboles…).
  1381.  
  1382. (bcopy 1)        fl 1
  1383. (eq? (bcopy x) x)    fl ƒ  ;(en supposant x ≠ symbole)
  1384. (=?  (bcopy x) x)    fl †    ;idem
  1385.  
  1386. (.i.replace; quelconque1 quelconque2)    Fermeture:ProcN    2
  1387.  
  1388. Remplace physiquement toutes les occurrences (au sens de eq?)  de quelconque1  par quelconque2. Cette fermeture utilise le mécanisme des indirections pour effectuer le remplacement. A utiliser avec précaution sur les identificateurs de variable et a fortiori sur les identificateurs de constante (en particulier ƒ, †…). Son utilité reste à découvrir…
  1389.  
  1390. (define x ‘(a b c))    fl (a b c)
  1391. (replace ‘b ‘k)    fl k
  1392. x            fl (a k c)
  1393.  
  1394. (.i.≈;)    Fermeture:ProcN    0
  1395.  
  1396. Obtenu au clavier par Option-X. Retourne la dernière valeur obtenue au top-level.
  1397.  
  1398. (openi “palmipède”)    fl «IO-Unit»
  1399. (readio (≈))        fl (define (palmipede v)…)
  1400.  
  1401. (.i.where; quelconque)    Fermeture:ProcN    1
  1402.  
  1403. Retourne l’adresse de quelconque  en mémoire dans un entier de taille fixe (32 bits).
  1404.  
  1405. (.i.find; quelconque)    Fermeture:ProcN    1
  1406.  
  1407. Retourne la liste des identificateurs de variables dont la valeur dans l’environnement global est égale  (au sens de eq?)  à quelconque. Particulièrement utile pour retrouver le symbole associé à une fermeture…
  1408.  
  1409. (define x 1+)    fl {Closure: {Code 6800xx for 1+} in {Env: ()}}
  1410. (find x)    fl (x 1+)
  1411.  
  1412. 5.5 L’interface Help
  1413.  
  1414. Nous décrirons ici l’implémentation réalisée sur MacIntosh II.  Cette réalisation reste incomplète à deux points de vue: le compilateur n’est pas encore “utilisable”, l’environnement reste encore embryonnaire (pas d’impression, taille limitée des fichiers…).
  1415.  
  1416. 5.5.1 .i.Configuration
  1417.  
  1418. Rappelons que l’interprète Help ne tourne que sur 68020+, il ne peut donc être utilisé que sur MacSE30 ou MacII. Il peut tourner sur très peu de mémoire (500 Ko) si l’on est prêt à supporter des GCs fréquents. Une taille mémoire de 1 Mo commence a être confortable. Help “tourne” sous MultiFinder ou système 7 sans problème.
  1419.  
  1420. La taille .i.mémoire; “demandée” par Help est tout simplement la taille affichée en sélectionnant l’application “Paresseux” et en demandant les Infos (Command-I). sous le Finder.On peut alors la fixer à sa convenance. Par défaut, elle est ajustée à 512 Ko. Modifiez la si vous avez plus (je j(espère pour vous).
  1421.  
  1422. Pour modifier d’autres caractéristiques de Help, un ensemble de ressources TEMPLATES pour RESEDIT (à insérer dans votre Resedit avec Resedit) est fournie avec Help. Il permet d’éditer aisément les différentes .i.ressources; intéressantes.
  1423.  
  1424. 5.5.1.1 La ressource CONF (Id 0, “Configuration”)
  1425.  
  1426. Contient quatre champs modifiables par l’utilisateur:
  1427.  
  1428. t    Font Id: permet de fixer la fonte utilisée par défaut par l’éditeur Help. La valeur initiale (22) correspond à la fonte Courrier (fonte non proportionnelle, permettant une indentation de qualité).
  1429. t    Font Size: permet de fixer la taille de la fonte utilisée par défaut par l’éditeur Help. Valeur par défaut: 9.
  1430. t    Block Visu: permet de fixer la durée (en soixantièmes de secondes)  pendant laquelle l’éditeur Help visualise le bloc lexical courant (parenthèses, crochets et accolades correspondantes) lors de l’utilisation de la souris ou des touches de déplacement. Valeur initiale: 6 soit 1/10 seconde.
  1431. t    Stack Memory %Age: permet de fixer le pourcentage de mémoire réservée aux pile. Valeur initiale :10% (très largement suffisant).
  1432.  
  1433. 5.5.1.2 Les ressources STC# 
  1434.  
  1435. Elles contiennent un ensemble de chaînes (codée “à la C”). La première (Id 0, “SynF Names”)  contient le nom de toutes les formes syntaxiques du langage et sont modifiables  à la convenance de l’utilisateur (qui devra quand même modifier tous ses sources…).
  1436.  
  1437. La seconde (Id 1, “Erreurs”) contient alternativement le message d’erreur correspondant à l’erreur dont le nom suit. Là encore, l’utilisateur peut si il le désire modifier les messages d’erreur (sans aucun problème) et les noms des erreurs (avec modification des sources si il font références à des symboles d’erreur).
  1438.  
  1439. 5.5.1.3 La ressource STCL (Id 0, “Startup File”)
  1440.  
  1441. Elle contient le nom du fichier évalué par l’interprète au démarrage. Modifiable au gré de l’utilisateur (nom par défaut: “Start”). Il est possible d’indiquer un chemin d’accès complet en utilisant la syntaxe précisée aux fermetures openi et  openo.
  1442.  
  1443. 5.5.1.4 La ressource STCN (Id 0, “Closures Names”)
  1444.  
  1445. Elle contient un ensemble d’informations afférentes à chacune des fermetures prédéfinies. Pour chacune des fermetures, il est possible de préciser:
  1446.  
  1447. t    Strictness: nombre en hexadécimal qu’il faut considérer comme un tableau de 16 bits, dont les 15 bits de poids faible indique (quand le bit n est positionné) que la fermeture est stricte par rapport à son nièm argument et dont le bit de poids fort indique si la fermeture est stricte par rapport à tous les autres arguments.  Il est évidemment assez facile de transformer Help en un “Pseudo-Scheme” en mettant tous ces champs à $FFFF et en utilisant la macro defkap (au lieu de define) du fichier de démarrage.
  1448.  
  1449. t    Arity: Si la fermeture est d’arité fixe (type 0), ce champ indique son arité. Si elle est d’arité variable (type 1), il indique son arité minimale. La modification de ces champs par l’utilisateur n’est ni utile, ni conseillée.
  1450.  
  1451. t    Type: Désigne le type de la procédure (arité fixe:0, arité variable: 1). La modification de ces champs par l’utilisateur n’est ni utile, ni conseillée.
  1452.  
  1453. t    The string: Désigne tout simplement le nom du symbole qui désignera la fermeture. Si un nom est modifié, il faudra bien évidemment modifier tous les sources utilisant cette fermeture (y compris le fichier de démarrage !).
  1454.  
  1455. 5.5.1.5 La ressource CART (Id 200, “Reader conf”)
  1456.  
  1457. Contient 256 octets désignant au lecteur le type de chacun des caractères ASCII. Pour modifier convenablement ce tableau afin de modifier la micro-syntaxe de Help, se reporter au §4.2.6FR.
  1458.  
  1459. 5.5.1.6 Les ressources WIND
  1460.  
  1461. Afin de s’adapter parfaitement tant à l’utilisateur qu’au type d’écran utilisé. Il est possible de choisir la répartition des fenêtres à l’écran. Pour ceci il suffit de modifier au choix:
  1462.  
  1463. t    La taille et position de fenêtre “Transcript”, ID 1000;
  1464. t    Les tailles et positions des cinq fenêtres d’édition qu’utilise cycliquement l’éditeur à chaque création de fenêtre (ID 1001 à 1005).
  1465.  
  1466. 5.5.2 Utilisation de l’éditeur
  1467.  
  1468. L’éditeur utilisant intensivement les routines de la ROM, il possède de ce fait certaines limitations, la plus importante étant que toutes les fenêtres d’édition ne peuvent contenir un texte qui fasse plus de 32K caractères. Il arrive des choses indéfinies (mais sans danger) en cas de dépassement.
  1469.  
  1470. La fenêtre “Transcript” reçoit les messages d’erreurs (elle correspond à l’unité d’entré sortie dénotée au démarrage par le symbole “stder”). Etant donnée qu’elle a la même limitation en taille que toutes les fenêtres… il est indispensable de la “nettoyer” de temps à autre.
  1471.  
  1472. Toutes les fenêtres sont à la fois des fenêtres d’édition et d’évaluation. La touche de validation employée permet de choisir entre les deux modes:
  1473.  
  1474. t    La touche “retour chariot”  permet d’utiliser les fenêtres en mode “éditeur”. L’indentation est automatique ainsi que le “matching” des parenthèses, crochets et accolades.
  1475.  
  1476. t    La touche ENTER (clavier numérique) permet d’évaluer la forme sélectionné (si une sélection a été faite)  ou de procéder à la sélection automatique de la S-expression supérieure et à son évaluation.
  1477.  
  1478. Dans ce cas, il est possible de jouer sur l’impression de la valeur (boucle READ-EVAL-PRINT):
  1479.  
  1480. t    Si on appuie sur Shift en même temps qu’ENTER, il n’y aura pas impression de la valeur. Ceci permet naturellement d’éviter le “forçage” par l’imprimeur de toutes les suspensions contenues dans la valeur.
  1481.  
  1482. t    Si on appuie sur Option en même temps qu’ENTER, la valeur sera imprimée sur l’unité d’entrée sortie dénotée par le symbole stder. Ceci est particulièrement utile lorsque l’on désire les valeurs sans abîmer le fichier évalué.
  1483.  
  1484. Le “click” souris permet de vérifier le “matching” des “()”, “[]” et “{}”. Si il n’y a pas de correspondance, il y a émission d’un bip sonore. Si on maintient la touche Option appuyée durant le click, la sélection restera, permettant de copier, effacer…. Le double click permet de sélectionner un “mot”.
  1485.  
  1486. 5.5.2 L’évaluateur et les “bugs”…
  1487.  
  1488. En cas de .i.bug; pendant une évaluation (icône en forme de petit Mac+) ou durant un GC (icône de Mark, Sweep, Compacifieur (1,2,3)):
  1489.  
  1490. t    Si vous utilisez un “Debugger”, il suffit de sauter à l’adresse contenue dans le registre D6 (Taper G D6 sous MacsBug). Il y aura alors retour au Top-Level, dans les meilleures conditions possibles (piles et registres de la machine restaurés…), le système peut être instable si le Tas MacIntosh ou Help ont subi des dommages….
  1491.  
  1492. t    Sinon, le “System Error Manager” va tenter de dessiner un dialogue contenant un message d’erreur et deux boutons. Il se peut que le dessin soit incomplet…. Le bouton de gauche est le classique “Redémarrer”, celui de droite permet de “Reprendre” dans les conditions signalées ci-dessus… (rafraîchir ensuite l’écran en “zoomant” puis “dézoomant” une fenêtre…).
  1493.  
  1494.  
  1495.  
  1496.  
  1497. Bibliographie
  1498.  
  1499. [Abelson 85] :     Harold Abelson et Gerald Jay Sussman avec Julie Sussman
  1500.     Structure and Interpretation of Computer Programs
  1501.     M.I.T. Press, Cambridge, 1985
  1502. [Aho 83]:    A. Aho, J. Hopcroft et  J. Ullmann
  1503.     Structures de données et Algorithmes
  1504.     InterEditions 87 (orig.  Addison & Wesley 83)
  1505. [Aho 86]:    A. Aho, R. Sethi et  J. Ullmann
  1506.     Compilateurs: Principes, Techniques et Outils
  1507.     InterEditions 89 (orig.  Addison & Wesley 86)
  1508. [Allen 78]:    John Allen
  1509.     Anatomy of LISP
  1510.     McGraw-Hill Inc., 1978
  1511. [Allison 86]:    Lloyd Allison
  1512.     A Practical introduction to denotational semantics
  1513.     Cambridge University Press, 1986
  1514. [Ashcroft 85]:    Edward A. Ashcroft, William W. Wadge
  1515.     Lucid, the Dataflow Programming Language
  1516.     Academic Press, 1985
  1517. [Avenhaus 90]    J. Avenhaus & K. Madlener
  1518.     Term Rewriting and Equationnal Reasoning
  1519.     Elsevier Science Publishers - North Holland, 1990
  1520. [Barendregt 84]    Barendregt H.P.
  1521.     The Lambda calculus, Its syntax and semantics
  1522.     North Holland, 1984
  1523. [Bloss 88]    A. Bloss, P. Hudak, J. Young
  1524.     Code Optimisations for Lazy  Evaluation
  1525.     Lisp ans Symbolic Computation ,Vol. 1, N° 2,p 147-164 (1988)
  1526. [Briot 86]    J.P. Briot, P. Cointe & E. Saint-James
  1527.     Réécriture et récursion dans une fermeture
  1528.     Journées Langages Orientés Objet - p90-100
  1529. [Cayrol 85] :    Cayrol Michel
  1530.     Conception, Formalisation et Expérimentation d’un modèle pour le 
  1531.     traitement d’objets finis ou infinis dénombrables.
  1532.     Thèse d’Etat , Université Paul Sabatier, 1985
  1533. [Cayrol 87] :     Schiex Thomas,  Cayrol Michel
  1534.     Psil: L’infini en programmation
  1535.     AFCET-RFIA 1987
  1536. [Cayrol 90]    Cayrol Michel, Palmade Olivier, Schiex Thomas
  1537.     ATMS: A new semantics.
  1538.     En soumission (New generation computing), 1990
  1539. [Chailloux 80]:    Jérôme Chailloux
  1540.     Le Modèle VLisp: Description,  Implémentation et Evaluation
  1541.     Thèse de troisième cycle, Université P. et M. Curie (Paris VI), 1980
  1542. [Chailloux ??]:    Jérôme Chailloux & ??
  1543.     Manuel Le_Lisp version 15.21 
  1544.     INRIA - 19??
  1545. [Clinger 82]:    William Clinger
  1546.     NonDeterministic Call by Need is Neither Lazy Nor by Name
  1547.     ACM Symposium on Lisp and Functionnal Programming, 1982
  1548. [Clinger 87]:    William Clinger, Jonathan Rees (Editors)
  1549.     Revised3 Report on the Algorithmic Language Scheme
  1550.     M.I.T. Artificial Intelligence Memo. 
  1551. [CM2 87]:    Thinking Machines Company
  1552.     Connection Machine - Model CM-2 - Technical Summary
  1553.     Thinking Machines technical report HA87-4 , 1987
  1554. [Cohen 83]:    Comparison of Compacting Algorithms for Garbage Collection
  1555.     Jacques Cohen & Alexandru Nicolau
  1556.     ACM Transactions on Prgramming Languages and Systems Vol5, N°4, 
  1557.     Octobre 1983 - p532-553
  1558. [Cousineau 89]:    Guy Cousineau et Gérard Huet
  1559.     The CAML Primer - Projet Formel
  1560.     INRIA-ENS- 1989
  1561. [Dybvig 90]:    R. Kent Dybvig & Robert Hieb
  1562.     A New Approach to Procedures with Variable Arity
  1563.     Lisp & Symbolic computation, Vol.3, N°3, p229-244 (1990)
  1564. [Field 88]:    Anthony J. Field, Peter G. Harisson
  1565.     Functionnal Programming
  1566.     Addison Wesley Publishing company - 1988
  1567. [Gabriel 85]:    Richard P. Gabriel
  1568.     Performance and Evaluation of Lisp Systems
  1569.     The MIT Press - 1985
  1570. [Girardot  85]:    Jean Jacques Girardot
  1571.     Les langages et  les systèmes LISP
  1572.     EdiTests, 1985
  1573. [Halstead  85]:    Halstead R.H.
  1574.     MultiLisp: A Language for concurrent symbolic computation.
  1575.     ACM Transactions on Prgramming languages and systems 7(4),
  1576.     (p 501-538) (Octobre 1985).
  1577. [Hillis  ??]:    Hillis ??
  1578.     The Connection machine 
  1579.  
  1580. [Hindley 86]:    J. Roger Hindley & Jonathan P. Seldin
  1581.     Introduction to Combinators and l-Calculus
  1582.     Cambridge University Press, 1986
  1583.     Addison Wesley Publishing Company, 1968
  1584. [Jaulent 87]:    P. Jaulent & L. Baticle
  1585.     µ-processeurs 68020, 68030 et leurs coprocesseurs.
  1586.     Eyrolles (1987)
  1587. [Knuth 68]:    Donald E. Knuth
  1588.     The Art of Computer Programming. Vol.1. Fundamental Algorithms
  1589.     Addison Wesley Publishing Company, 1968
  1590. [Mac 85-86]:    Apple Computer Inc.
  1591.     Inside MacIntosh, Vol I à V
  1592.     Addison Wesley Publishing Company, 1985-86
  1593. [Schiex 87] :     Schiex Thomas
  1594.     Psil: Manipulation d’objets infinis dénombrables
  1595.     Rapport de D.E.A., Université Paul Sabatier, 1987
  1596. [Schiex 88]    Schiex Thomas
  1597.     Psil et la Connection Machine
  1598.     Rapport pour le C.N.R.S et le Conseil Régional (1988)
  1599. [Schiex 89] :     Schiex Thomas
  1600.     Psil: Un héritier de Scheme
  1601.     BIGRE: Special Issue : “Putting Scheme to work” , 1989
  1602. [Schiex 91]    Schiex Thomas
  1603.     Interprétation et Compilation d'un dialecte paresseux de Scheme: Help
  1604.     Phd. Thesis
  1605.     Université Paul Sabatier, Toulouse, FrancePhd. Thesis
  1606. [Steele 90]    Guy L. Steele Jr.
  1607.     Common Lisp: the language (2nd edition)
  1608.     Digital Press - 1990
  1609. [Tarski 55]    Tarski A.
  1610.     A Lattice-theorical FixPoint Theorem and its Applications
  1611.     Pacific J. Math. (p285-309), 1955
  1612.  
  1613. Exemples
  1614.  
  1615. {Composition de fonctions}
  1616. {••••••••••••••••••••••••}
  1617. (define (rond f g) 
  1618.         (lambda x (f (apply g x))))
  1619.  
  1620. {Les entiers naturels}
  1621. {••••••••••••••••••••}
  1622. (define n (… 0))
  1623.  
  1624. {Les fibonacci}
  1625. {•••••••••••••}
  1626. (define (fibn n1 n2) (cons n1 (fibn (+ n1 n2) n1)))
  1627. (define fibl (cons 1 (cons 1 (map (∞ +) fibl (-1 fibl)))))
  1628.  
  1629. {La suite bizarre}
  1630. {••••••••••••••••}
  1631. (define (entrelace l1 l2)
  1632.       (cons (0 l1) (cons (0 l2) (entrelace (-1 l1) (-1 l2)))))
  1633. (define biz (entrelace (… 0) biz))
  1634.  
  1635. {flot de lecture}
  1636. {•••••••••••••••}
  1637. (define (in)(cons (read)(in)))
  1638. (define input (in))
  1639.  
  1640. {Factorielle CPS…}
  1641. {••••••••••••••••}
  1642. (define (fact x k)
  1643.      (cond (zero? x)(k 1)
  1644.      (fact (- x 1)(lambda(n)(k (* x n))))))
  1645. (define factl (cons 1 (map (∞ *) (… 1) factl)))
  1646.  
  1647. {Le crible d'Erathostène}
  1648. {•••••••••••••••••••••••}
  1649. (define (erat l)
  1650.      (cons (0 l)
  1651.            (erat (diff (-1 l)
  1652.                        (map (∞ *) (∞ (0 l)) l)))))
  1653.  
  1654. {Décomposition en nombres premiers}
  1655. {•••••••••••••••••••••••••••••••••}
  1656. (define (dec n l)
  1657.   (cond (=? n 1) ()
  1658.         (zero? (modulo n (0 l))) (cons (0 l) (dec (/ n (0 l)) l))
  1659.         (< n (* (0 l)(0 l))) (list n)
  1660.         (dec n (-1 l))))
  1661.  
  1662. {Church numbers}
  1663. {••••••••••••••}
  1664. (define plus 
  1665.   (lambda(n1)
  1666.          (lambda(n2)
  1667.                 (lambda(f)
  1668.                        (lambda(x)
  1669.                               ((n1 f) ((n2 f) x)))))))
  1670.  
  1671. (define zero (lambda(f) (lambda(x) x)))
  1672.  
  1673. (define mul
  1674.   (lambda(n1)
  1675.          (lambda(n2)
  1676.                 (lambda(f)
  1677.                        (lambda(x)
  1678.                               ((n1 (n2 f)) x))))))
  1679. (define suc 
  1680.   (lambda(n)
  1681.          (lambda(f)
  1682.                 (lambda(x) ((n f)(f x))))))
  1683.  
  1684. (define un (suc zero))
  1685. (define deux (suc un))
  1686. (define trois (suc deux))
  1687. (define quatre ((mul deux)deux))
  1688.  
  1689. (define exp
  1690.   (lambda(n1)
  1691.          (lambda(n2)
  1692.                 (lambda(f)
  1693.                        (lambda(x)
  1694.                               (((n2 n1) f) x))))))
  1695.  
  1696. {The paradoxical combinators}
  1697. {••••••••••••••••••••••••••}
  1698.  
  1699. ;by Church Y0
  1700. (define (Y0 g)
  1701.   ((lambda(x) (G (x x)))(lambda(x)(G (x x)))))
  1702.  
  1703. {The fixed point for fixed point combinator}
  1704. (define (G y)
  1705.   (lambda(f) (f (y f))))
  1706.  
  1707. ;by Turing Y1=Y0 G
  1708. (define Y1 
  1709.   ((lambda(a)
  1710.     (lambda(b) (b ((a a) b)))) (lambda(a)
  1711.                                  (lambda(b) (b ((a a) b))))))
  1712. ;un autre fpc délirant par Klop
  1713. (define £
  1714.  (lambda(a)
  1715.   (lambda(b)
  1716.    (lambda(c)
  1717.     (lambda(d)
  1718.      (lambda(e)
  1719.       (lambda(f)
  1720.        (lambda(g)
  1721.         (lambda(h)
  1722.          (lambda(i)
  1723.           (lambda(j)
  1724.            (lambda(k)
  1725.             (lambda(l)
  1726.              (lambda(m)
  1727.               (lambda(n)
  1728.                (lambda(o)
  1729.                 (lambda(p)
  1730.                  (lambda(q)
  1731.                   (lambda(s)
  1732.                    (lambda(t)
  1733.                     (lambda(u)
  1734.                      (lambda(v)
  1735.                       (lambda(w)
  1736.                        (lambda(x)
  1737.                         (lambda(y)
  1738.                          (lambda(z)
  1739.                           (lambda(r)
  1740. (r (((((((((((((((((((((((((
  1741.              (t h)i)s)i)s)a)f)i)x)e)d)p)o)i)n)t)c)o)m)b)i)n)a)t)o)r)
  1742.                            ))))))))))))))))))))))))))))
  1743.  
  1744. (define $ ((((((((((((((((((((((((
  1745.           (£ £)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)£)
  1746.  
  1747. ;un autre fpc délirant "à la Klop" en VF
  1748. (define £
  1749.  (lambda(a)
  1750.   (lambda(b)
  1751.    (lambda(c)
  1752.     (lambda(e)
  1753.      (lambda(f)
  1754.       (lambda(g)
  1755.        (lambda(h)
  1756.         (lambda(i)
  1757.          (lambda(j)
  1758.           (lambda(k)
  1759.            (lambda(l)
  1760.             (lambda(m)
  1761.              (lambda(n)
  1762.               (lambda(o)
  1763.                (lambda(p)
  1764.                 (lambda(q)
  1765.                  (lambda(r)
  1766.                   (lambda(s)
  1767.                    (lambda(t)
  1768.                     (lambda(u)
  1769.                      (lambda(v)
  1770.                       (lambda(w)
  1771.                        (lambda(x)
  1772.                         (lambda(y)
  1773.                          (lambda(z)
  1774.                           (lambda(d)
  1775. (d (((((((((((((((((((((((((
  1776.               (H e)l)p)E)s)t)T)e)r)r)i)b)l)e)m)e)n)t)F)l)e)m)m)a)r)d)
  1777.                             ))))))))))))))))))))))))))))
  1778.  
  1779. ;la fonctionnelle associée à factorielle
  1780. (define (FF f)
  1781.   (lambda(x)
  1782.     (cond (zero? x) 1
  1783.           (* (f (1- x)) x))))
  1784.  
  1785. {calcul avec des inconnues: remplacer par max en 1 passe}
  1786. {•••••••••••••••••••••••••••••••••••••••••••••••••••••••}
  1787. (define (rpm l)
  1788.   (letrec [((f n rest&maxc)
  1789.                (cons (cons max (0 rest&maxc))
  1790.                      (cond (>? n (-1 rest&maxc)) n (-1 rest&maxc))))
  1791.            (rest (reduce f '(() | 0) l))
  1792.            (max (-1 rest))]
  1793.           (0 rest)))
  1794.  
  1795.  
  1796. Index
  1797.  
  1798.  
  1799. * 20
  1800. + 20
  1801. - 20
  1802. / 20
  1803. 1+ 20
  1804. 1- 20
  1805. <>? 17
  1806. <? 21
  1807. =! 12
  1808. =? 16
  1809. >? 21
  1810. acos 21
  1811. and 30
  1812. append 19
  1813. apply 22
  1814. asin 22
  1815. atan 22
  1816. atanh 22
  1817. atom? 18
  1818. bcopy 32
  1819. begin 14
  1820. binding=! 25
  1821. binding=? 24
  1822. bindings 13
  1823. bit-arrays 7
  1824. bitand! 25
  1825. bitarray? 25
  1826. bitchg! 27
  1827. bitclr! 26
  1828. bitcount 26
  1829. bitfind 26
  1830. bitnot! 26
  1831. bitor! 26
  1832. bitset! 26
  1833. bitxor! 26
  1834. blength 32
  1835. boolean? 16
  1836. booléens 16
  1837. bug 35
  1838. call/cc 29
  1839. call/ep 29
  1840. car=! 18
  1841. caractères spéciaux 10
  1842. cdr=! 18
  1843. cell 24
  1844. cell=! 24
  1845. cell? 24
  1846. cellules 7; 23
  1847. chaînes 7
  1848. chrono 31
  1849. close 28
  1850. coerce 31
  1851. compgc 32
  1852. cond 12
  1853. Configuration 33
  1854. cons 18
  1855. cons? 18
  1856. constantes 9
  1857. contrôle 29
  1858. cos 21
  1859. cosh 22
  1860. defext 13
  1861. define 10
  1862. defmacro 13
  1863. Déverminage 14
  1864. doublets 17
  1865. entiers 5
  1866. entrée/sortie 27
  1867. envar 25
  1868. environment? 24
  1869. environnement 24
  1870. eq? 16
  1871. equal? 17
  1872. erreurs 8; 28
  1873. error 29
  1874. error? 29
  1875. eval 30
  1876. exp 22
  1877. expand 23
  1878. explain 29
  1879. expressions primitives 10
  1880. fermetures 16
  1881. find 32
  1882. float 21
  1883. flottants 6
  1884. flushio 28
  1885. force 29
  1886. gestion d’erreurs 14
  1887. getcode 23
  1888. getenv 23
  1889. getstrict 23
  1890. ibase 22
  1891. if 30
  1892. intern 19
  1893. lambda 11
  1894. length 19
  1895. let 13
  1896. letrec 14
  1897. list 18
  1898. list? 17
  1899. listes 7; 17
  1900. load 28
  1901. log 22
  1902. makebitarray 25
  1903. makecell 24
  1904. makeenv 25
  1905. masgc 31
  1906. mémoire 33
  1907. modulo 21
  1908. mots clés 8
  1909. neq? 16
  1910. nequal? 17
  1911. nombres 20
  1912. nomemo 12
  1913. not 16
  1914. null? 18
  1915. openi 28
  1916. openo 28
  1917. or 30
  1918. pause 14
  1919. prédicats d’équivalence 16
  1920. prin 27
  1921. prindepth 27
  1922. prinio 28
  1923. prinlength 27
  1924. print 27
  1925. printdebug 28
  1926. quote 10
  1927. read 27
  1928. readio 28
  1929. replace 32
  1930. ressources 33
  1931. runtime 31
  1932. Sémantique 3
  1933. setstrict 23
  1934. sin 21
  1935. sinh 22
  1936. sqrt 22
  1937. stder 27
  1938. stdi 27
  1939. stdo 27
  1940. step 15
  1941. symbol? 19
  1942. symboles 7; 19
  1943. tan 21
  1944. tanh 22
  1945. type 30
  1946. warn 14
  1947. where 32
  1948. zero? 21; 27
  1949. ∞ 19
  1950. ≈ 32
  1951. … 19
  1952. 1 Du moins, c’est la cas dans le cadre d’une utilisation normale. Il est possible d’élargir la portée d’une variable (Cf  § 3.5.1.1FR).
  1953. 2 Les premiers évaluateurs Lisp utilisaient une syntaxe différente, distinguant programmes et données (M Expressions opposées aux S Expressions actuelles).
  1954. 3 NaN= Not a Number. Retourné lors de la lecture d’une séquence de caractères ne formant pas un nombre flottant.
  1955. 4 structure de données comportant deux champs non typés appelés (pour des raisons historiques) CAR et CDR  (prononcé  “coudair).
  1956. 5  dans le sens de eq?, il n’y a donc pas de “hash-consing”.
  1957. 6 c’est le seul objet Help ayant une durée de vie limitée.
  1958. 7 type invisible pour l’utilisateur.
  1959. 8 type invisible pour l’utilisateur.
  1960. 9 type invisible pour l’utilisateur.
  1961.  
  1962.